Quoit Design (HDU 1007)平面的最近点对
题目大意:
给定平面上的 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)平面的最近点对的更多相关文章
- (洛谷 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 ...
- HDU 1007 平面上最近点对 分治
思路: 分治 套路题 //By SiriusRen #include <cmath> #include <cstdio> #include <algorithm> ...
- HDU ACM 1007 Quoit Design 分而治之的方法,最近点
意甲冠军:给n坐标点.半一对点之间的距离所需的距离最近. 分析:分而治之的方法,最近点. #include<iostream> #include<algorithm> #inc ...
- HDU 1007(套圈 最近点对距离)
题意是求出所给各点中最近点对的距离的一半(背景忽略). 用分治的思想,先根据各点的横坐标进行排序,以中间的点为界,分别求出左边点集的最小距离和右边点集的最小距离,然后开始合并,分别求左右点集中各点与中 ...
- HDU 1007 Quoit Design 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
- HDU 1007 Quoit Design(经典最近点对问题)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1007 Quoit Design Time Limit: 10000/5000 MS (Java/Oth ...
- HDU 1007 Quoit Design【计算几何/分治/最近点对】
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 1007 Quoit Design 分治求最近点对
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
随机推荐
- reset清除所有浏览器默认样式
温馨提示 reset 的目的不是清除浏览器的默认样式, 这仅是部分工作. 清除和重置是紧密不可分的.reset 的目的不是让默认样式在所有浏览器下一致, 而是减少默认样式有可能带来的问题.reset ...
- asp.net--owin的知识点
一篇很好的介绍owin的文章 http://kb.cnblogs.com/page/509236/ Owin在webconfig中定义启动配置类IdentityConfig的方法(代码来自极客学院的教 ...
- [bzoj1708][Usaco2007 Oct]Money奶牛的硬币_动态规划_背包dp
Money奶牛的硬币 bzoj-1708 Usaco-2007 Oct 题目大意:在创立了她们自己的政权之后,奶牛们决定推广新的货币系统.在强烈的叛逆心理的驱使下,她们准备使用奇怪的面值.在传统的货币 ...
- [python]win32api
安装完pywin32以后一定要重启啊!!!!!!!!!!!!
- [React Native] Target both iPhone and iPad with React Native
By default, React Native only targets iPhone - so if you run on an iPad, it will show up as a scaled ...
- HDU2955_Robberies【01背包】
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Java内存管理及垃圾回收总结
概述 Java和C++的一个很重要的差别在于对内存的管理.Java的自己主动内存管理及垃圾回收技术使得Java程序猿不须要释放废弃对象的内存.从而简化了编程的过程.同一时候也避免了因程序猿的疏漏而导致 ...
- vs2013+ffmpeg开发环境搭建【转】
本文转载自:http://blog.csdn.net/spaceyqy/article/details/43115391 每当看到配环境,我就泪流满面,好吧,闲话不多说,进入正题. 1.去官方下载ff ...
- SUSE glibc升级为2.18过程记录
先验知识:1.运行时,动态库的装载依赖于ld-linux.so.6的实现,它查找共享库的顺序如下:(1)ld-linux.so.6在可执行的目标文件中被指定,可用readelf命令查看(2)ld-li ...
- 关于一些UI的插件(杂)
1.时间插件 //日期框 $('.date-picker').datepicker(); 2.checkbox 保存checkbox的值 // 组装选择的标签 var check = $(" ...