Mikemao666 @ 2020-07-29 08:14:44
大数据就直接输出了0.0000。。。
#include <bits/stdc++.h>
using namespace std;
struct god {
int x;
int y;
} p[200005],q[200005];
double dis(god x,god y) {
return sqrt(abs(x.x-y.x)*abs(x.x-y.x)+abs(y.x-y.y)*abs(y.x-y.y));
}
bool cmp(god a,god b){
return a.x<b.x;
}
double divide(int l,int r) {
if(l==r)return 1e7;
int mid=(l+r)>>1;
double d;
int tx=p[mid].x;
int tot(0);
d=min(divide(l,mid),divide(mid+1,r));
for(int i=l,j=mid+1; (i<=mid||j<=r); i++) {
while(j<=r&&(p[i].y>p[j].y||i>mid))
q[tot++]=p[j],j++;
if(abs(p[i].x-tx)<d&&i<=mid) {
for(int k=j-1; k>mid&&j-k<3; k--)
d=min(d,dis(p[i],p[k]));
for(int k=j; k<=r&&k-j<2; ++k)
d=min(d,dis(p[i],p[k]));
}
if(i<=mid)q[tot++]=p[i];
}
for(int i=l,j=0; i<=r; ++i,++j)p[i]=q[i];
return d;
}
int n;
int main() {
cin>>n;
for(int i=0; i<n; ++i) {
cin>>p[i].x>>p[i].y;
}sort(p,p+n,cmp);
printf("%.4lf",divide(0,n-1));
return 0;
}
by kcs007 @ 2020-07-29 08:53:23
结构体里用double,输入的是实数