二维空间最近点对(分治)

来源:互联网 发布:制作招聘广告app软件 编辑:程序博客网 时间:2024/05/16 05:44

      分治求解,二维空间最近点对。

#include<algorithm>#include<iostream>#include<cstdio>#include<cmath>using namespace std;typedef long long LL;const int maxn=100005;struct Point{    int x , y;};Point p[maxn];inline LL Distance(Point a,Point b){    int dx = a.x - b.x , dy = a.y - b.y;    return (LL) dx * dx + (LL)dy * dy;}bool cmpx(Point a,Point b){    return a.x < b.x;}bool cmpy(int a,int b){    return p[a].y < p[b].y;}int ypos[maxn];///Call   closedis(p, 1, n);LL closedis(Point *p, int l, int r){    if(l == r)return 1LL << 62;    if(l+1 == r) return Distance(p[l], p[r]);    int mid=(l+r)/2;    LL ans = min(closedis(p, l, mid), closedis(p, mid+1, r));    int num = 0;    for(int i = l; i <= r; i++)    {        if((LL)(p[i].x - p[mid].x) * (p[i].x - p[mid].x) <= ans)            ypos[num++]=i;    }    sort(ypos, ypos + num, cmpy);    for(int i = 0; i < num; i++)    {//        int k=0;        for(int j = i + 1; j < num; j++)        {            if((LL)(p[ypos[i]].y-p[ypos[j]].y)*(p[ypos[i]].y-p[ypos[j]].y)>=ans)break;            else            {                ans=min(ans, Distance(p[ypos[i]], p[ypos[j]]));//                k++;            }//            if(k>6)break; ///不知优化?正确定待证。。        }    }    return ans;}


0 0