题目大意:
给定平面上的 n 个点,求距离最近的两个点的距离的一半。 n <= 10^5.

 

晕乎乎的度过了一上午。。。

总之来学习下分治吧233

分治就是把大问题拆成小问题,然后根据对小问题处理出的结果合并成大问题的答案

比如说这道题,如果我们按照X坐标把所有的点分成两组:

(木哈哈请叫我盗图狂魔○( ^皿^)っHiahiahia…

像上面我们把点分成了集合S1,S2

点对对应的被划分成3种:S1内,S2内,跨S1.S2

那假若我们分别处理出了S1,S2内的答案,再取个min叫做d

那么跨过分界线的点对就不能超过d,这是一个很有用的条件!不信?我们来看看

我们管分界线的X坐标叫x0

首先要知道,所有距离x0超过d的点都不用考虑

其次,这些点之间y的相对距离超过d的也不用考虑

这就把对一个点而言需要考虑的另一个点们限制在了一个小矩形里

再加上d是我们左右分治出来的答案

结论就是对于一个点我们最多只需要考虑6个点就可以了

你可以自己画画?这六个点都分布在矩形的顶点上

而具体实现其实就简单暴力了

具体就看码吧~

 #include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,cnt;
struct point{
double x,y;
}p[];
int mk[];
bool cmpx(point A,point B){return A.x<B.x;}
bool cmpy(int A,int B){return p[A].y<p[B].y;}
double dis(int x,int y){return sqrt((p[x].x-p[y].x)*(p[x].x-p[y].x)+(p[x].y-p[y].y)*(p[x].y-p[y].y));}
double solve(int l,int r){
if(l==r)return 1e18;
if(l+==r)return dis(l,r);
int mid=(l+r)>>;
double x0=(p[mid].x+p[mid+].x)/2.0;
double d=min(solve(l,mid),solve(mid+,r));
cnt=;
for(int i=l;i<=r;i++)
if(p[i].x-x0<=d&&p[i].x-x0>=-d)
mk[++cnt]=i;
sort(mk+,mk++cnt,cmpy);
for(int i=;i<=cnt;i++)
for(int j=i-;j>=;j--)
if(p[mk[i]].y-p[mk[j]].y>d)break;
else d=min(d,dis(mk[i],mk[j]));
return d;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);
sort(p+,p++n,cmpx);
printf("%.4lf",solve(,n));
return ;
}

Quoit Design (HDU 1007)平面的最近点对的更多相关文章

  1. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  2. HDU 1007 平面上最近点对 分治

    思路: 分治 套路题 //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> ...

  3. HDU ACM 1007 Quoit Design 分而治之的方法,最近点

    意甲冠军:给n坐标点.半一对点之间的距离所需的距离最近. 分析:分而治之的方法,最近点. #include<iostream> #include<algorithm> #inc ...

  4. HDU 1007(套圈 最近点对距离)

    题意是求出所给各点中最近点对的距离的一半(背景忽略). 用分治的思想,先根据各点的横坐标进行排序,以中间的点为界,分别求出左边点集的最小距离和右边点集的最小距离,然后开始合并,分别求左右点集中各点与中 ...

  5. HDU 1007 Quoit Design 平面内最近点对

    http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...

  6. HDU 1007 Quoit Design(经典最近点对问题)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...

  7. HDU 1007 Quoit Design【计算几何/分治/最近点对】

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  8. hdu 1007 Quoit Design (最近点对问题)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. hdu 1007 Quoit Design 分治求最近点对

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

随机推荐

  1. 关于Hanoi算法

    java经典算法——河内算法(Hanoi) 有三根相邻的柱子,标号为A,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出 ...

  2. ZOJ 3494

    超级神奇有趣题. AC自动机+数位DP.其实,数位DP在处理含有某些数字时特别不好处理,应该把它倒转为求不含有.这道题把数位DP+AC自动机结合起来,实在是很巧妙,把数字变为串来处理,强大! 要使用A ...

  3. 初中级DBA必需要学会的9个Linux网络命令,看看你有哪些还没用过

    笔者不久前写了一篇文章<做DBA必须学会,不会会死的11个Linux基本命令>,博文地址为:http://blog.csdn.net/ljunjie82/article/details/4 ...

  4. Hook的两个小插曲

    看完了前面三篇文章后,这里我们来一个小插曲~~~~ 第一个小插曲.是前面文章一个CM精灵的分析.我们这里使用hook代码来搞定. 第二个小插曲,是如今一些游戏,都有了支付上限,比如每天仅仅能花20块钱 ...

  5. Jetty:部署到Jetty

    Web应用的框架 标准Jetty公布版本号能部署标准servlet Spec Web应用和Jetty内部ContextHandler部署描写叙述符,或者两者的一个混合. Web应用是可部署的动态(se ...

  6. class com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text

    运行mapreduce遇到的错: Java.lang.ClassCastException: classcom.sun.jersey.core.impl.provider.entity.XMLJAXB ...

  7. Windows 10彻底关闭自动更新

    关键点:把流量计费开启.

  8. Hdu-6252 2017CCPC-Final J.Subway Chasing 差分约束

    题面 题意:有2个人,都去坐地铁,但是他们相差了X分钟,但是他们也一直在通讯,于是你就知道,你在AB站点中间的时候,他在CD中间,(B一定等于A+1或者A,同理D也是),问你每2个站之间需要的时间的一 ...

  9. Mysql数据类型(一)

    介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考链接:http://www.runoob.com/mysql/mysql-data- ...

  10. (转载) 小议TCP的MSS(最大分段)以及MTU(最大传输单元)

    [背景知识]  MTU: Maximum Transmission Unit 最大传输单元 MSS: Maximum Segment Size 最大分段大小PPPoE: PPP Over Ethern ...