这题WA很久,本人还随机了100个样例来测试,结果全过(白浪费我一个小时)
然后看了讨论区,就用C++提交了一遍,,于是,,过了,大家记得用C++交一遍
输出的时候注意G++对%f和%lf的区别,,,,据说是这样(大神轻拍)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define station 1
#define agent 2
#define MAX 100010
const double D_MAX=1e100;
struct point
{
double x;
double y;
int belong;
};
point node[MAX*2];
point y[MAX*2];
bool cmp1(point a,point b)
{
return a.x<b.x;
}
bool cmp2(point a,point b)
{
return a.y<b.y;
}
double cal(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y)*1.0);
}
double fin(int l,int r)
{
if(l==r)
{
return D_MAX;
}
if(r-l==1)
{
if(node[l].belong+node[r].belong==3)
{
return cal(node[l],node[r]);
}
else
{
return D_MAX;
}
}
double res;
if(r-l==2)
{
double d[3];
if(node[l].belong+node[l+1].belong==3)
{
d[0]=cal(node[l],node[l+1]);
}
else
{
d[0]=D_MAX;
}
if(node[l+1].belong+node[r].belong==3)
{
d[1]=cal(node[l+1],node[r]);
}
else
{
d[1]=D_MAX;
}
if(node[l].belong+node[r].belong==3)
{
d[2]=cal(node[l],node[r]);
}
else
{
d[2]=D_MAX;
}
res=d[0];
res=res<d[1]?res:d[1];
res=res<d[2]?res:d[2];
return res;
}
int m=(l+r)/2;
double left=fin(l,m);
double right=fin(m+1,r);
res=left<right?left:right;
int len=0;
int i;
for(i=l;i<=r&&fabs(node[i].x-node[m].x)<res;i++)
{
y[len++]=node[i];
}
int j;
sort(y,y+len,cmp2);
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++)
{
if(y[j].y-y[i].y>=res)
{
break;
}
double temp;
if(y[i].belong+y[j].belong==3)
{
temp=cal(y[i],y[j]);
}
else
{
temp=D_MAX;
}
if(temp<res)
{
res=temp;
}
}
}
return res;
}
int main()
{
int i;
int total;
scanf("%d",&total);
while(total--)
{
int n;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf %lf",&node[i].x,&node[i].y);
node[i].belong=station;
}
for(i=n;i<2*n;i++)
{
scanf("%lf %lf",&node[i].x,&node[i].y);
node[i].belong=agent;
}
sort(node,node+2*n,cmp1);
double res=fin(0,2*n-1);
printf("%.3lf\n",res);
}
return 0;
}