#include <bits/stdc++.h>
typedef long long LL;
typedef unsigned long long ULL;
typedef long double LD;
#define mem(l,val) memset((l),(val),(sizeof(l)))
using namespace std;
const int INF = 0x3f3f3f3f;
const double OO = 1e25;
const int eps = 1e-8;
const int S = 4*1e5+5;
struct point {double x,y;}p[S],tmp[S];
inline int sgn(double x) {return fabs(x)<eps?0:(x<0?-1:1);}
inline double distance(point a,point b) {return hypot(a.x-b.x,a.y-b.y);}
inline bool cmp_xy(const point& a,const point& b)
{return sgn(a.x-b.x)<0 || (!sgn(a.x-b.x) && sgn(a.y-b.y) < 0);}
inline bool cmp_y(const point& a,const point& b) {return (sgn(a.y-b.y) < 0);}
inline double closest(int l,int r)
{
double dis = OO;
if(l == r) return dis;
if(l == r-1) return distance(p[l],p[r]);
int mid = l+r>>1;
double d1 = closest(l,mid),d2 = closest(mid+1,r);
dis = min(d1,d2);
int k = 0;
for(int i = l;i <= r;++i)
if(fabs(p[mid].x-p[i].x) <= dis) tmp[++k] = p[i];
sort(tmp+1,tmp+k+1,cmp_y);
for(int i = 1;i <= k;++i)
for(int j = i+1;j <= k;++j)
{
if(tmp[j].y-tmp[i].y >= dis) break;
dis = min(dis,distance(tmp[i],tmp[j]));
}
return dis;
}
int main(int argc,char *argv[])
{
int n;scanf("%d",&n);
for(int i = 1;i <= n;++i) scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+1,p+n+1,cmp_xy);
printf("%.4lf\n",closest(0,n-1));
return 0;
}
我不理解