题解:AT_abc467_d [ABC467D] Concentric Circles

· · 题解

ABC467 D 题解

这个题大致翻译如下:

有两个点 P(P_x,P_y)Q(Q_x,Q_y)\odot C_1 上。
有两个点 R(R_x,R_y)S(S_x,S_y)\odot C_2 上。

给定四个点坐标,问:是否存在满足条件的圆?两个圆可以重合。

思路

根据我们在小学二年级初中就学过的垂径定理,PQ 连线的中垂线过 \odot C_1 的圆心, RS 连线的中垂线过 \odot C_2 的圆心。所以,如果两个圆能同心,则这两个中垂线有交点。如果这两个中垂线有交点,则直线 PQ 和直线 RS 有交点。

图中,C 为共同圆心,蓝线为圆上点的连线,绿线为中垂线。

计算

先考虑不合法的情况: $PQ$ 和 $RS$ 无交点时,则 $\overrightarrow{PQ}//\overrightarrow{RS}$,则有 $(Q_x-P_x)(S_y-R_y)=(Q_y-P_y)(S_x-R_x)$。 但是,如果两条中垂线重合,则交点有无数个,此时也有 $\overrightarrow{PQ}//\overrightarrow{RS}$,但这种情况是合法的。 所以,额外需要判断一下两条中垂线是否重合。中垂线重合,当且仅当中点连线垂直于这两条直线。由于当前是在 $\overrightarrow{PQ}//\overrightarrow{RS}$ 的前提下,所以只要判断和其中一条直线是否重合即可。 两个中点:$M_1(\frac{P_x+Q_x}{2},\frac{P_y+Q_y}{2}),M_2(\frac{R_x+S_x}{2},\frac{R_y+S_y}{2}) \overrightarrow{M_1M_2}=(\frac{R_x+S_x}{2}-\frac{P_x+Q_x}{2},\frac{R_y+S_y}{2}-\frac{P_y+Q_y}{2}) ### AC Code [AC Record](https://atcoder.jp/contests/abc467/submissions/77660065) ```cpp #include <bits/stdc++.h> using namespace std; typedef long long LL; LL t, px, py, qx, qy, rx, ry, sx, sy; int main() { scanf("%lld", &t); while (t--) { scanf("%lld%lld%lld%lld%lld%lld%lld%lld", &px, &py, &qx, &qy, &rx, &ry, &sx, &sy); if ((px - qx) * (ry - sy) == (py - qy) * (rx - sx) && (px - qx) * (rx + sx - px - qx) + (py - qy) * (ry + sy - py - qy) != 0) printf("No\n"); else printf("Yes\n"); } return 0; } ```