题目题解
but my code is outing
#include<bits/stdc++.h>
using namespace std;
const int B=2e9;
struct dot{int x,y;
}a[200010],ddt[200010];
inline int ass(int a){return a>0?a:-a;}
inline double dis(dot i,dot j){return sqrt((i.x-j.x)*(i.x-j.x)+(i.y-j.y)*(i.y-j.y));}
bool cmp(dot a,dot b){return a.x==b.x?a.y<b.y:a.x<b.x;}
bool cmp2(dot a,dot b){return a.y<b.y;}
double ans=B;
double fz(int l,int r){if(l==r)return B;if(l+1==r)return dis(a[l],a[r]);int m=(l+r)>>1,k=0;double d=min(fz(l,m),fz(m+1,r));for(int i=l;i<=r;i++)if(ass(a[m].x-a[i].x)<d)ddt[k++]=a[i];sort(ddt,ddt+k,cmp2);for(int i=0;i<k;i++)for(int j=i+1;j<k&&ddt[j].y-ddt[i].y<d;j++)d=min(d,dis(ddt[i],ddt[j]));return d;
}
int main() {int n;scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+n+1,cmp);printf("%.4lf",fz(1,n));return 0;
}
std:
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1000001;
const int INF=2 << 20;
int n,temp[maxn];
struct Point {double x,y;
} S[maxn];
bool cmp(const Point &a,const Point &b){if(a.x == b.x)return a.y<b.y;else return a.x<b.x;
}
bool cmps(const int &a,const int &b){return S[a].y<S[b].y;
}
double min(double a,double b){return a<b ? a : b;
}
double dist(int i,int j){double x=(S[i].x-S[j].x)*(S[i].x-S[j].x);double y=(S[i].y-S[j].y)*(S[i].y-S[j].y);return sqrt(x+y);
}
double merge(int left,int right){double d=INF;if(left == right)return d;if(left+1 == right)return dist(left,right);int mid=left+right >> 1;double d1=merge(left,mid);double d2=merge(mid+1,right);d=min(d1,d2);int i,j,k=0;for(i=left;i <= right;i++)if(fabs(S[mid].x-S[i].x)<d)temp[k++]=i;sort(temp,temp+k,cmps);for(i=0;i<k;i++)for(j=i+1;j<k && S[temp[j]].y-S[temp[i]].y<d;j++){double d3=dist(temp[i],temp[j]);if(d>d3)d=d3;}return d;
}
int main(){scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf%lf",&S[i].x,&S[i].y);sort(S,S+n,cmp);return !printf("%.4lf\n",merge(0,n-1));
}