题解:AT_abc467_d [ABC467D] Concentric Circles
liujianchong
·
·
题解
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 上。
给定四个点坐标,问:是否存在满足条件的圆?两个圆可以重合。
思路
根据我们在小学二年级初中就学过的垂径定理,P 和 Q 连线的中垂线过 \odot C_1 的圆心, R 和 S 连线的中垂线过 \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;
}
```