本文将同步发布于:
题目
题意简述
给定 n n n 个圆 ( x i , y i , r i ) (x_i,y_i,r_i) (xi,yi,ri),每个圆对应一个点集 S i = { ( x , y ) ∣ ( x − x i ) 2 + ( y − y i ) 2 ≤ r i 2 } S_i=\left\{(x,y)\mid (x-x_i)^2+(y-y_i)^2\leq r_i^2\right\} Si={ (x,y)∣(x−xi)2+(y−yi)2≤ri2}。
求一个最小的 i i i 满足 ∩ j = 1 i S j = ∅ \cap_{j=1}^i S_j=\varnothing ∩j=1iSj=∅;如果无解输出 NIE
。
题解
简单又自然的随机化
我们考虑枚举 i i i,然后判定 S 1 ∼ i S_{1\sim i} S1∼i 的交集是否为空。
如何判定呢?我们想到一个简单的方法,我们随机一些在圆的边界上的点,只需要判定这些点是否存至少在一个点在所有圆内即可。
这种方法简单又自然,但是随机化算法正确率不高,这远远不够。
研究几何性质
如果做计算几何题而抛弃几何性质,所得到的做法往往是劣解。
继续沿着上面的思路,我们同样考虑枚举 i i i,然后判定 S 1 ∼ i S_{1\sim i} S1∼i 的交集是否为空。
不同的是,我们定义一个交集中横坐标最大的点为代表点(代表点只会有一个,这是因为圆是凸集,凸集的交集还是凸集)。
我们发现,如果一些圆的交集非空,那么其代表点一定满足:它是所有圆两两交集的代表中横坐标最小的那个。
证明十分显然,考虑交集的意义即可。
最后的结论
综上所述,对于一个 i i i,我们只需要求出 1 ∼ i − 1 1\sim i-1 1∼i−1 与 i i i 的代表点即可,如果所有代表点中横坐标最小的那一个在所有的圆内,那么其合法,否则不合法,换言之,答案为 i i i。
我们考虑证明这个结论:
- 若没有交集,则这个点必然不合法,符合我们的预期;
- 若有交集,则我们需要证明这个点是交集的代表点。
- 假设其不是交集的代表点,则交集的代表点可能在其左右;
- 左边:不可能,若交集存在,则代表点的横坐标 ≥ \geq ≥ 当前点横坐标。
- 右边:不可能,考虑当前点在 S a ∩ S b S_a\cap S_b Sa∩Sb 中得到,那么所有 x ≥ x\geq x≥ 当前点横坐标的点均被交集抛弃,因此代表点的横坐标 ≤ \leq ≤ 当前点横坐标。
- 由夹逼过程可知结论正确。
这个算法的时间复杂度为 Θ ( n 2 ) \Theta(n^2) Θ(n2)。
参考程序
下面我们来解决两圆求交的问题。
下面介绍一下两种方法:余弦定理和相似三角形。
余弦定理
用余弦定理求解需要用到三角函数,常数大,精度差。
我们考虑下图:
对 △ A C B \triangle{ACB} △ACB 运用余弦定理,得到 r a 2 + d 2 − 2 d r a cos α = r b 2 r_a^2+d^2-2dr_a\cos\alpha=r_b^2 ra2</