| ||
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=200000; const int inf=(1<<30); struct Point { double x,y;//坐标 int id;//标号 }; int n;//点数 Point a[maxn]; int cx,cy;//最近点对 double cmin; double dis(Point h,Point k) { return sqrt((h.x-k.x)*(h.x-k.x)+(h.y-k.y)*(h.y-k.y)); } bool cmp(Point h,Point k) { if(h.x!=k.x) return h.x<k.x; return h.y<k.y; } int y[maxn],len; bool cmp2(int i,int j) { return a[i].y<a[j].y; } void solve(int l,int r) { if(l==r) return ; if(l==r-1) { double tmp=dis(a[l],a[r]); if(tmp<cmin) cmin=tmp,cx=a[l].id,cy=a[r].id; } if(l==r-2) { double l1=dis(a[l],a[l+1]); double l2=dis(a[l+1],a[l+2]); double l3=dis(a[l],a[l+2]); if(l1<l2&&l1<l3) { if(l1<cmin) cmin=l1,cx=a[l].id,cy=a[l+1].id; } if(l2<l1&&l2<l3) { if(l2<cmin) cmin=l2,cx=a[l+1].id,cy=a[l+2].id; } if(l3<cmin) cmin=l3,cx=a[l].id,cy=a[l+2].id; } int mid=(l+r)>>1; solve(l,mid);solve(mid+1,r); len=0; for(int i=l;i<=r;i++) { if(fabs(a[i].x-a[mid].x)<cmin) { y[len++]=i; } } sort(y,y+len,cmp2); for(int i=0;i<len;i++) { for(int j=i+1,cnt=1;j<len&&cnt<=7;j++,cnt++) { double tmp=dis(a[y[i]],a[y[j]]); if(tmp<cmin) { cmin=tmp,cx=a[y[i]].id,cy=a[y[j]].id; } } } } int main() { while(scanf("%d",&n)==1) { cmin=inf; for(int i=0;i<n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); a[i].id=i+1; } sort(a,a+n,cmp); solve(0,n-1); printf("%d %d/n",min(cx,cy),max(cx,cy)); //printf("%.3lf/n",cmin); } return 0; }
|