题目
给$N$个点,求最近点对的距离的一半。
数据范围
$N \leq 100000$
做法
分治。
先按x坐标分成左右2部分,则最近点对的位置有2种情况:
- 2个点都在左边或者都在右边
- 1个点在左边另1共个点在右边
对于情况1,直接递归计算即可。
对于情况2,由于我们已经递归计算了情况1,我们一定得到了一个初步的最小距离$d$。那么,在情况2中,对于距离大于$d$的点对就不用计算了。只需要计算离分划的$x_m$距离不超过$d$的点。并且,对于确定的$y_p$,为了不重复,只要计算范围在$[y_p-d, y_p]$的点。这里涉及到对y排序,由于是分治,很容易将归并排序加入其中。这样,对于确定的点$(x_p,y_p)$,其中$x_m-d \leq x_p \leq x_m + d$,只要计算一个下图所示的矩形区域。显然,左右的正方形内最多有4个点,所以矩形内最多有6个点。于是,对于每个点,只要计算5个点即可。
分治的层数是$O(log_2N)$,每层操作是$O(N)$的,所以总的复杂度是$O(N\times log_2N)$。
代码
|
|