![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 %:pragma GCC optimize(2) 2 #include<bits/stdc++.h> 3 #define DB double 4 #define m (((l)+(r))>>1) 5 #define sqr(x) ((x)*(x)) 6 using namespace std; 7 const int N=200005; 8 int n,tot; DB ans; 9 struct point {DB x,y;}a[N],now[N]; 10 inline DB dis(point u,point v) {return sqrt(sqr(u.x-v.x)+sqr(u.y-v.y));} 11 inline bool cmp(point u,point v) {return u.x==v.x?u.y<v.y:u.x<v.x;} 12 inline bool cmp0(point u,point v) {return u.y<v.y;} 13 DB solve(int l,int r) { 14 if (l>=r) return 1e18; if (l+1==r) return dis(a[l],a[r]); 15 DB ret=min(solve(l,m),solve(m+1,r)); int k=0; 16 for (int i=l; i<=r; i++) if (fabs(a[i].x-a[m].x)<ret) now[++k]=a[i]; 17 sort(now+1,now+1+k,cmp0); 18 for (int i=1; i<k; i++) 19 for (int j=i+1; j<=k&&now[j].y-now[i].y<ret; j++) ret=min(ret,dis(now[i],now[j])); 20 return ret; 21 } 22 int main() { 23 scanf("%d",&n); 24 for (int i=1; i<=n; i++) scanf("%lf%lf",&a[i].x,&a[i].y); 25 if (n==1) return printf("0.00\n"),0; else 26 if (n==2) return printf("%.2lf\n",dis(a[0],a[1])),0; 27 sort(a+1,a+1+n,cmp); 28 printf("%.4lf\n",solve(1,n)); 29 return 0; 30 }