UPC1430 Raid(最近点对距离——分治)

链接:http://exam.upc.edu.cn/problem.php?cid=1430&pid=27

题意:求两个集合S1,S2中最近两点距离。

思路:

最近点对距离问题,分治法。
将每个集合分为根据 x 坐标分为左右两个子点集,先分别求两边点集中的最短点对距离ans1, ans2,求最短ans = min(ans1, ans2),然后考虑:形成最短点对距离的两点可能分别属于两个子点集的情况,则两点一定在 [point[mid].x - ans,point[min].x+ans]
之间(point[mid].x为中间点的横坐标),更新ans即可。
    见:https://blog.csdn.net/lttree/article/details/25156173

代码:

#include 
using namespace std;
const int maxn = 2e5+5;
int a[maxn];
struct Node{double x, y; int flag;}node[maxn];
bool cmp1(Node a, Node b){return a.x>1;
    double ans = min(ShortestDist(l, mid), ShortestDist(mid+1, r));
    int i, j, cnt=0;
    for(i=l; i=node[mid].x-ans && node[i].x<=node[mid].x+ans) a[cnt++] = i;

    sort(a, a+cnt, cmp2);
    for(i=0; i= ans) break;
            ans = min(ans, Distance(node[a[i]], node[a[j]]));
        }

    }

    return ans;
}
int main()
{
    int i,t,n; cin >> t;
    while(t--) {
        scanf("%d",&n);
        for(i=0;i

 

你可能感兴趣的:(水题)