P1429
#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));
}

浙公网安备 33010602011771号