ABC467D,但是我没学过计算几何

· · 题解

你是一个初二的 OIer,你今天在打 ABC,你看到了这道题。

由于你之前完全没有学过计算几何,所以你需要使用初中知识点爆切这道题,否则会爽爽掉分。

你注意力惊人,注意到了这道题可以使用垂径定理,也就是圆的中点在线段的中垂线上。进一步,你注意到了假如两条线段不平行,就必定有解,如下图所示:

你很快想到了线段的斜率公式 k=\dfrac{y_A-y_B}{x_A-x_B},斜率相等两条线段平行,对于本题就是 \dfrac{y_P-y_Q}{x_P-x_Q}=\dfrac{y_R-y_S}{x_R-x_S}。你注意到 AtCoder 的祖传艺能之卡精度,所以你交叉相乘,得到了 (y_P-y_Q)(x_R-x_S)=(x_P-x_Q)(y_R-y_S)!现在这道题已经做完一半了。

接着,你发现两条线段假如平行,有圆心当且仅当中垂线共线,下图左边是共线情况,右边是不共线情况:

现在你的问题来到判断中垂线是否共线了。一种你容易想到的解法是斜率相乘得 -1 加上一个点来求出中垂线的解析式,然后判断,但是这样似乎无法避免浮点运算,肯定会被 ABC 的传统艺能卡飞起来的。

你再次发挥了注意力,中垂线重合等价于一条线段的中点在另一条线段的中点上,并且两直线平行。后面一点之前已经判断了,前面这一部分可以转化为一条线段的中点和另一条线段两端的距离相等,如图所示:

其中 AD=BD。为了避免浮点误差,你发现可以将坐标乘二,然后使用距离的平方判断相等。同时,你注意到这一步的运算值比较大,需要开 long long。于是你愉快的使用初中知识点爆切了这道题!

由于集训机房打不开 AtCoder,所以代码就不放了。