Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30919 Accepted Submission(s): 8120
#include <stdio.h> #include <math.h> #include <stdlib.h> #define Max(x,y) (x)>(y)?(x):(y) struct Q { double x, y; } q[100001], sl[10], sr[10]; int cntl, cntr, lm, rm; double ans; int cmp(const void*p1, const void*p2) { struct Q*a1=(struct Q*)p1; struct Q*a2=(struct Q*)p2; if (a1->x<a2->x)return -1; else if (a1->x==a2->x)return 0; else return 1; } double CalDis(double x1, double y1, double x2, double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void MinDis(int l, int r) { if (l==r) return; double dis; if (l+1==r) { dis=CalDis(q[l].x,q[l].y,q[r].x,q[r].y); if (ans>dis) ans=dis; return; } int mid=(l+r)>>1, i, j; MinDis(l,mid); MinDis(mid+1,r); lm=mid+1-5; if (lm<l) lm=l; rm=mid+5; if (rm>r) rm=r; cntl=cntr=0; for (i=mid; i>=lm; i--) { if (q[mid+1].x-q[i].x>=ans)break; sl[++cntl]=q[i]; } for (i=mid+1; i<=rm; i++) { if (q[i].x-q[mid].x>=ans)break; sr[++cntr]=q[i]; } for (i=1; i<=cntl; i++) for (j=1; j<=cntr; j++) { dis=CalDis(sl[i].x,sl[i].y,sr[j].x,sr[j].y); if (dis<ans) ans=dis; } } int main() { int n, i; while (scanf("%d",&n)==1&&n) { for (i=1; i<=n; i++) scanf("%lf%lf", &q[i].x,&q[i].y); qsort(q+1,n,sizeof(struct Q),cmp); ans=CalDis(q[1].x,q[1].y,q[2].x,q[2].y); MinDis(1,n); printf("%.2lf\n",ans/2.0); } return 0; }