hdu 5721 空间点对距离,记录点

来源:互联网 发布:爱的算法txt 下载 编辑:程序博客网 时间:2024/06/05 00:07
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll INF=0x3f3f3f3f3f3f3f3f;int flag;struct node1{    ll x,y;    int id;}node[100010],node2[100010];int cmpx(node1 p1,node1 p2){    if(p1.x!=p2.x)        return p1.x<p2.x;    return p1.y<p2.y;}int cmpy(node1 p1,node1 p2){    return p1.y<p2.y;}ll dis(int x,int y,node1 nodee[]){    return ((nodee[x].x-nodee[y].x)*(nodee[x].x-nodee[y].x)+(nodee[x].y-nodee[y].y)*(nodee[x].y-nodee[y].y));}int X,Y;ll d;void solve(int a,int b,int opt){    if(a==b)        return ;    if(a+1==b)    {        if(node[a].id!=opt&&node[b].id!=opt)        {            if(d>dis(a,b,node))            {                d=dis(a,b,node);                if(opt==-1)                {                    X=node[a].id;                    Y=node[b].id;                }            }        }        return ;    }    int mid=(a+b)/2;    solve(a,mid,opt);    solve(mid+1,b,opt);    int c=0;    for(int i=a;i<=b;i++)    {        if(node[i].id!=opt&&abs(node[mid].x-node[i].x)<=d)            node2[c++]=node[i];    }    sort(node2,node2+c,cmpy);    for(int i=0;i<c-1;i++)        for(int j=i+1;j<c&&node2[j].y-node2[i].y<d;j++)        {            if(d>dis(i,j,node2))            {                d=dis(i,j,node2);                if(opt==-1)                {                    X=node2[i].id;                    Y=node2[j].id;                }            }        }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        int n;        flag=0;        scanf("%d",&n);        for(int i=0;i<n;i++)        {            scanf("%lld%lld",&node[i].x,&node[i].y);            node[i].id=i;        }        d=INF;        sort(node,node+n,cmpx);        solve(0,n-1,-1);        ll ans=d*(n-2);        flag=1;        d=INF;        solve(0,n-1,X);        ans+=d;        d=INF;        solve(0,n-1,Y);        ans+=d;        printf("%lld\n",ans);    }    return 0;}

0 0
原创粉丝点击