ABC467D
upd on 2026.7.19:补充了有关于斜率计算的内容。
一眼秒题。
题意
给你四个点
解法
你只要学完了初中数学所有内容并了解了部分高中数学内容就应当可以秒掉。
容易发现
考虑我们如何尺规作图作出一个圆。实际上我们取了三个不共线的点,然后将它们顺次连接得到两条线段,分别作这两条线段的垂直平分线交于一点,则这个点为圆心。
所以我们利用这个思想,分别算出线段
但是这样会忽略两条垂直平分线重合的情况。所以特判一下,如果
怎么算垂直平分线
温馨提示:注意精度问题,尽量不要用除法,用乘法代替算。
代码实现是把上面的一堆式子化简之后得到的。读者可以自己尝试化简一下。
:::success[Code]
i64 px, py, qx, qy, rx, ry, sx, sy;
inline void solve () {
cin >> px >> py >> qx >> qy >> rx >> ry >> sx >> sy;
if ((qy - py) * (rx - sx) != (ry - sy) * (qx - px)) cout << "Yes" << endl;
//这里直接算的 PQ 和 RS 的斜率,因为你发现两条线段的垂直平分线斜率比较式化简之后就是这个东东
else {
i64 Axx = px + qx, Ayy = py + qy;
i64 Bxx = rx + sx, Byy = ry + sy;
if ((Ayy - Byy) * (qy - py) == (-qx + px) * (Axx - Bxx)) cout << "Yes" << endl;//垂直平分线重合
else cout << "No" << endl;
}
}
::: :::info[彩蛋] 下面这张图是我们学校参加了这场比赛的人的这个题的提交情况:
(没有提交的可以看作是不屑于做这个题)
状况十分惨烈啊。 :::