解析:平面上的点分治,先递归得到左右子区间的最小值d,
再处理改区间,肯定不会考虑哪些距离已经大于d的点对,
对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,
x轴方向只用考虑[x-d,x+d](x是分的中轴线),y轴方向只用考虑
[y-d,y](y是这个点的y值),因为d值一直在变小,所以这个矩形包
含的点数很少。

代码

#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const double INF=1e9;
const int maxn=;
int N;
struct Po
{
double x,y;
Po(double x=,double y=):x(x),y(y){}
}po[maxn],B[maxn];
bool cmp(const Po& a,const Po& b)
{
if(a.x!=b.x) return a.x<b.x;
return a.y<b.y;
}
double dfs(int l,int r)
{
if(l>=r) return INF;
int mid=(l+r)/;
double x=po[mid].x;
double d=min(dfs(l,mid),dfs(mid+,r)); //先处理左右子区间
int ls=l,rs=mid+,k=l;
while(ls<=mid&&rs<=r) //归并排序
{
if(po[ls].y<=po[rs].y) B[k++]=po[ls++];
else B[k++]=po[rs++];
}
while(ls<=mid) B[k++]=po[ls++];
while(rs<=r) B[k++]=po[rs++];
for(int i=l;i<=r;i++) po[i]=B[i];
int Size=;
for(int i=l;i<=r;i++)
{
if(fabs(po[i].x-x)>=d) continue; //不考虑
for(int j=Size;j>=;j--)
{
double a=po[i].x-B[j].x;
double b=po[i].y-B[j].y;
if(b>=d) break;
d=min(d,sqrt(a*a+b*b)); //更新
}
B[++Size]=po[i];
}
return d;
}
int main()
{
while(scanf("%d",&N)!=EOF&&N)
{
double x,y;
for(int i=;i<=N;i++)
{
scanf("%lf%lf",&x,&y);
po[i]=Po(x,y);
}
sort(po+,po+N+,cmp);
double ans=dfs(,N);
if(ans<) printf("%.4f\n",ans);
else printf("INFINITY\n");
}
return ;
}

uva10245-The Closest Pair Problem(平面上的点分治)的更多相关文章

  1. UVA 10245 - The Closest Pair Problem

    Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...

  2. UVA 10245 The Closest Pair Problem 最近点问题 分治算法

    题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...

  3. 2.11 2D平面最近点对问题[closest pair problem]

    [本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...

  4. UVA 10245 The Closest Pair Problem【分治】

    题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269 题意: 求平面最近点对. 分析: 经典问题. n比 ...

  5. UVa 10245 The Closest Pair Problem (分治)

    题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...

  6. Problem E: 平面上的点和线——Point类、Line类 (V)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  7. Problem D: 平面上的点和线——Point类、Line类 (IV)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  8. Problem C: 平面上的点和线——Point类、Line类 (III)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  9. Problem B: 平面上的点和线——Point类、Line类 (II)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

随机推荐

  1. 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)

    关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...

  2. Hive 6、Hive DML(Data Manipulation Language)

    DML主要是对Hive 表中的数据进行操作的(增 删 改),但是由于Hadoop的特性,所以单条的修改.删除,其性能会非常的低所以不支持进行级操作: 主要说明一下最常用的批量插入数据较为常用的方法: ...

  3. C++11中正則表達式測试

    VC++2010已经支持regex了, 能够用来编译下述代码. #include <string> #include <regex> #include <iostream ...

  4. How to center anything with css

    1. 绝对居中定位技术 我经常用margin:0 auto来实现水平居中,而一直认为margin:auto不能实现垂直居中……实际上,实现垂直居中仅需要声明元素高度和下面的CSS 优点:  缺点: 1 ...

  5. Linux查看系统状态及备份

    1. 如何看当前Linux系统有几颗物理CPU和每颗CPU的核数?cat /proc/cpuinfo将CPU的总核数除以物理CPU的个数,得到每颗CPU的核数.2. 查看系统负载有两个常用的命令,是哪 ...

  6. CSS Gradient详解

    啥也不说,先看代码: <style> div { width:100px;height:100px;border-radius:50px;/**第一行样式是设置容器的宽高,并且把圆角设置成 ...

  7. 黑马程序员——String类

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  8. 使用区域组织 ASP.NET MVC 应用程序

    MVC 模式可将应用程序的模型(数据)逻辑与其呈现逻辑和业务逻辑分离. 在 ASP.NET MVC 中,这种逻辑分离还在项目结构中以物理方式实现,在该项目结构中,控制器和视图保存在使用命名约定定义关系 ...

  9. JS中的for和for in循环

    1.for循环通常用来遍历数组或类数组对象 模式1:长度缓存 for(var i=0,max=arr.length;i<max;i++){ //your code } 模式2:逐减,与零比较比与 ...

  10. VC中遍历目标进程中的模块

    VC中遍历目标进程中的模块 MFC代码win32 也可以用 在下面代码进行修改转换就可以了CString strModule; 可以换成 char* 但是MODULEENTRY32结构中的szModu ...