是个变异的最近点对题目,用分治策略和计算几何做的话好像会超因为时间上是1000ms,下面这个贪心做法是看了别人的博客知道的。
处理红点到原点的距离然后根据距离排序,蓝点一样,然后二分查找最后处理最近的+-100的点,至于为什么是100应该是和计算几何做法中讲的最近点的区域有关,这个我也不是很理解就不做讲述。
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=100005;
struct Node
{
int x,y;
double dis;
}d[maxn];
bool cmp(const Node&a,const Node&b)
{
return a.dis<b.dis;
}
int main()
{
int n,x,y,a,b;
double dis,ans=maxn;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d", &d[i].x, &d[i].y);
d[i].dis=sqrt(d[i].x*d[i].x+d[i].y*d[i].y);
}
sort(d,d+n,cmp);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
dis=sqrt(x*x+y*y);
int m;
a=0,b=n-1;
while(a<b)
{
m=a+(b-a)/2;
if(d[m].dis>=dis) b=m;
else a=m+1;
}
for(int j=max(0,a-100);j<min(n,a+100);j++)
{
ans=min(ans,sqrt((x-d[j].x)*(x-d[j].x)+(y-d[j].y)*(y-d[j].y)));
}
}
printf("%.3f",ans);
}