#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
struct node1
{
double x,y;
}node[100010];
int cmpx(node1 p1,node1 p2)
{
return p1.x<p2.x;
}
int cmpy(node1 p1,node1 p2)
{
return p1.y<p2.y;
}
double dis(int x,int y)
{
return sqrt((node[x].x-node[y].x)*(node[x].x-node[y].x)+(node[x].y-node[y].y)*(node[x].y-node[y].y));
}
double solve(int a,int b)
{
if(a+1==b)
return dis(a,b);
if(a==b)
return INF*1.0;
int mid=(a+b)/2;
double d=min(solve(a,mid),solve(mid+1,b));
int l=mid,r=mid;
int flag1=0;
int flag2=0;
while(l>=a&&d>node[mid].x-node[l].x)
{
flag1=1;
l--;
}
while(r<=b&&d>node[r].x-node[mid].x)
{
flag2=1;
r++;
}
if(flag1)
l=l+1;
if(!flag2)
r=r+1;
sort(node+l+1,node+r,cmpy);
for(int i=l+1;i<r-1;i++)
for(int j=i+1;j<r&&node[j].y-node[i].y<d;j++)
{
d=min(dis(i,j),d);
}
return d;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=0;i<n;i++)
scanf("%lf%lf",&node[i].x,&node[i].y);
sort(node,node+n,cmpx);
printf("%.2f\n",solve(0,n-1)/2);
}
return 0;
}
平面最小点对 模板(hdu1007 uva10245)
最新推荐文章于 2024-06-20 23:50:49 发布