思路:分治
(对拍过洛谷题解)
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct p{
int x,y;
}a[100005];
p b[100005];
int n;
bool cmp(p a,p b){
return a.x<b.x;
}
bool cmpy(p a,p b){
return a.y<b.y;
}
double core(int l,int r){
if (l==r)return 0x3f3f3f3f3f3f3f3fLL;
if (l+1==r)return sqrt((a[l].x-a[r].x)*(a[l].x-a[r].x)+(a[l].y-a[r].y)*(a[l].y-a[r].y));
int mid=(l+r)/2;
double ans=min(core(l,mid),core(mid+1,r));
int cnt=0;
for (int i=l;i<=r;i++){
if (fabs(a[i].x-a[mid].x)<ans)b[++cnt]=a[i];
}
sort(b+1,b+cnt+1,cmpy);
for (int i=1;i<=cnt;i++){
for (int j=i+1;j<=cnt;j++){
if (fabs(b[j].y-b[i].y)>ans)break;
ans=min(ans,sqrt((b[i].x-b[j].x)*(b[i].x-b[j].x)+(b[i].y-b[j].y)*(b[i].y-b[j].y)));
}
}
return ans;
}
signed main(){
//freopen("1.in","r",stdin);
//freopen("2.out","w",stdout);
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
sort(a+1,a+1+n,cmp);
printf("%.2lf\n",core(1,n));
return 0;
}
