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 ...
随机推荐
- 【hihocoder 1473】小Ho的强迫症
[题目链接]:http://hihocoder.com/problemset/problem/1473 [题意] [题解] 假定初始为在在0位置(相对它左边那条线); 则考虑; 多少步之后,人又能这到 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- @Service注解的作用
@Service注解作用 1. 其getBean的默认名称是类名(头字母小写),可以@Service(“xxxx”)这样来指定, 2.其定义的bean默认是单例的,可以使用@Service(“b ...
- Linux中tty是什么(tty1~7)
tty:终端设备的统称. tty一词源于Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,后来这东西被键盘与显示器取代,所 ...
- Swift学习——变量var和let常量的用法(一)
Swift中的变量var和let常量 首先介绍一下Swift中的 var 和 let (1)var 是 variable的缩写形式,是变量的意思 ,是可改变的.并非数据类型 比如: 注意每一个语句后面 ...
- arcgis server10.2.2公布地图基础服务的详细步骤
1.直接打开制作好的.mxd文档,比方这里: 2.打开mxd文档之后.打开菜单:file-share as -services 弹出地图公布服务的界面: 点击publish之后,耐心的等待一段时间,地 ...
- BAT常问问题总结以及回答(多线程回答一)
多线程 什么是线程? 进程概念:进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间),比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间.当 ...
- Windows10 显示库、隐藏6个目录、隐藏OneDrive
Win10的资源管理器与之前的版本号最大的不同就是默认隐藏了库,又在此电脑中显示了6个用户目录. 但因为习惯了使用库进行文件的管理,这一改变有些令人不习惯. 以下就让我来教大家怎样显示库.以及隐藏这6 ...
- POJ3204 Ikki's Story - Road Reconstruction 网络流图的关键割边
题目大意:一个有源有汇的城市,问最少增加城市中的多少道路可以增加源到汇上各个路径上可容纳的总车流量增加. 网络流关键割边集合指如果该边的容量增加,整个网络流图中的任意从原点到汇点的路径的流量便可增加. ...
- ClassLoader.getResourceAsStream(name);获取配置文件的方法
ClassLoader.getResourceAsStream(name);路径问题 InputStream in = getClass().getResourceAsStream('/'+" ...