题目大意:
给定平面上的 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. SSH框架下单元测试的实现

    SSH框架下单元测试的实现 实现的功能 实现了部门的增删改查 对Action进行了单元测试 对Service 进行了单元测试,通过mock的方式实现. 实现的步骤 一.对Action层的单元测试实现 ...

  2. [bzoj2748][HAOI2012]音量调节_动态规划_背包dp

    音量调节 bzoj-2748 HAOI-2012 题目大意:有一个初值,给你n个$\delta$值,求最后不超过给定的限制的情况下的改变的最大值.每个$\delta$值可以+也可以-. 注释:$1\l ...

  3. 彻底解决Android GPS没法定位这一顽固问题

    大家去网上搜索Android定位location为null没法定位问题.预计有一大堆文章介绍怎样来解决.可是最后大家发现基本没用. 本文将从Android定位实现原理来深入分析没法定位原因并提出真正的 ...

  4. [SCSS] Convert SCSS Variable Arguments to JavaScript

    We will learn how to convert variable arguments by using rest operator in JavaScript. .sass-btn { co ...

  5. Vultr好server不敢独享

    Vultr是一家美国2014年成立的新公司.瞬间红遍世界,他是干什么的?他是serverVPS(Virtual Private Server)提供商,这个价格真实惊人的廉价5美金/月.折合人民币30元 ...

  6. _DataStructure_C_Impl:链串

    //_DataStructure_C_Impl:链串 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  7. Linux命令(二)——目录和文件管理命令

    一.Linux系统的目录结构 1.根目录(/):顶层目录,某些系统中的唯一分区. 2./bin命令文件目录:包含Linux命令的二进制可执行文件. 3./boot目录:存放系统的内核文件和引导装载程序 ...

  8. HDU3496 Watch the Movie 背包

    题目大意:给你n张电影门票,但一次只可以买m张,并且你最多可以看L分钟,接下来是n场电影,每一场电影a分钟,b价值,要求恰好看m场电影所得到的最大价值,要是看不到m场电影,输出0. 三个限制: 选电影 ...

  9. 1-1restful简介及资源介绍

  10. Java图片的压缩

    1.如果在springMvc中,会自带生成MultipartFile文件,将MultipartFile转化为File MultipartFile file1 = file; CommonsMultip ...