【几何】HDU 1007 Quoit Design 最近点对
模板
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> #include<math.h> #include<string> #include<iostream> #include<algorithm> using namespace std; #include<queue> #include<stack> #include<vector> #include<deque> #include<set> #include<map> struct Q { double x, y; } q[100001], sl[10], sr[10]; int cntl, cntr, lm, rm; double ans; int cmp(Q p1, Q p2) { return p1.x<p2.x; } 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 (void) { int n, i; while (scanf("%d",&n)==1&&n) { for (i=1; i<=n; i++) scanf("%lf %lf", &q[i].x,&q[i].y); sort(q+1,q+n+1,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; }