【题解】The Last Hole! [CF274C]
传送门:\(\text{The Last Hole!}\) \(\text{[CF274C]}\)
【题目描述】
给出平面上 \(n\) 个圆的圆心坐标,最开始它们的半径都是 \(0\),然后所有圆同时开始扩大,在时刻 \(t\) 时所有圆的半径均为 \(t\) 。
假设这些黑色的圆被放在一个无穷大的白色平面上,每个时刻都存在一些黑色、白色连通块。随着圆的逐渐增大,越来越多的圆会相交。
定义一个白色的封闭区域为一个“洞”,求最后一个“洞”消失的时刻。如果没有“洞”则输出 \(-1\)。
答案精度差不能超过 \(10^{-4}\) 。
【分析】
【计算几何全家桶】
画个图感受一下,发现所有的♂洞♂都可以简化为两种情况:由 呈锐角三角形的三个圆 或者 呈矩形的四个圆 所生成(指圆心呈 XX 形状)。
可以直接 \(O(n^3)\) 枚举包围圈,可知“洞”消失的部位一定是 外心/对角线交点。对于三角形取外接圆半径,对于矩形则取对角线长度一半,最后找最大值即为答案。
给出三角形顶点坐标不会求外接圆的,这里有个板子(输出有点鬼畜):\(\text{Circle Through Three Points [UVA190]}\)
但这样做的话在 \(\text{test 6}\) 就会 \(\text{WA}\) :
4
0 0
4 8
8 0
4 3
按照上述做法求出来答案为 \(5\),而实际上三角形外心与另一个圆心 \((4,3)\) 重合了,也就是说根本就不会出现“洞”。
所以正确做法应该是把所以可能的“洞”的消失点储存下来,并计算它在选出来的包围圈中消失所需时间 \(ti\) 。最后扫一遍所有圆,如果所有圆都没有在 \(ti\) 之前覆盖掉这个点,那么 \(ti\) 就是合法的。
时间复杂度为:\(O(n^3+kn)\),其中 \(k\) 为储存下来的可能消失点个数,由于不合法的较多,远达不到上界 \(n^3\),可以轻松水过。
【Code】
#include
#include
#include
#include
#include