POJ3714 Raid
程序员文章站
2022-05-09 10:04:31
...
题目链接
题意
给两组数目相同的点,求任意两个不同组的点的最短距离
思路
- 分治,把每次把点按x一分为二,求最短的距离,注意对于跨越分割线的点的连线需要特别判断
- 数据很大,会爆int
- printf()没有对于%lf的定义,要使用%f
参考代码
#include<cstdio>
#include<math.h>
#include<algorithm>
#include<iomanip>
using namespace std;
double maxa=1e50;
struct node
{
double x,y;
int kind;
};
node aa[200100];
node tmp[201000];
bool cmpx(node a,node b)
{
return a.x<b.x;
}
bool cmpy(node a,node b)
{
return a.y<b.y;
}
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double js(int l,int r)
{
if(l==r)
return maxa;
int mid = (l+r)/2;
double re=min(js(l,mid),js(mid+1,r));
int s=0;
for(int i=l; i<=r; i++)
{
if(fabs(aa[i].x-aa[mid].x)<=re)
{
tmp[s++]=aa[i];
}
}
sort(tmp,tmp+s,cmpy);
for(int i=0; i<s; i++)
{
for(int j=i+1; j<s; j++)
{
if(tmp[j].y-tmp[i].y>re)
break;
if(tmp[i].kind!=tmp[j].kind)
{
re=min(re,dis(tmp[i],tmp[j]));
}
}
}
return re;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
double ans=0;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&aa[i].x,&aa[i].y);
aa[i].kind=0;
}
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&aa[i+n].x,&aa[i+n].y);
aa[i+n].kind=1;
}
sort(aa,aa+2*n,cmpx);
ans=js(0,2*n-1);
printf("%.3f\n",ans);
}
}
上一篇: 题解 P1024 【一元三次方程求解】
下一篇: 洛谷P1024 一元三次方程求解 题解
推荐阅读
-
Linux 常见 RAID 及软 RAID 创建
-
Dell R710 raid磁盘阵列配置手册(大图版)
-
IBM system X3250 M4 配置RAID磁盘阵列的方法
-
服务器组装技术之LSI RAID配置硬盘热备图解
-
在RAID磁盘阵列下如何搭建Linux系统
-
Linux如何加载raid驱动以便使用RAID安装系统
-
linux中如何查看Raid磁盘阵列信息
-
RAID 独立磁盘冗余阵列 - redundant array of independent disks
-
LSI RAID配置手册(适用PERC3/dc,PERC4)图文教程
-
DELL R730服务器配置RAID与安装服务器系统以及域的控制详细图文教程