题目链接:https://vjudge.net/problem/HDU-1007

题意:给定n个点,求平面距离最小点对的距离除2。

思路:分治求最小点对,对区间[l,r]递归求[l,mid]和[mid+1,r]的最小点对,取两者中的小者设为d。然后处理一个点在左区间,一个点在右区间的情况。一个点P在左区间,如果使它与右区间Q一个点距离小于d的话,那么P到mid的距离一定小于的,Q也是,且P和Q的纵坐标之差小于d。可以证明这样的Q点最多6个。那么我们把符合到mid距离小于d的点按y排序后,遍历一遍更新d即可。

AC代码:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std; const int maxn=1e5+;
int n,id[maxn],cnt;
const double inf=1e30;
struct node{
double x,y;
}pt[maxn]; bool operator < (const node& a,const node& b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
} bool cmp(int a,int b){
return pt[a].y<pt[b].y;
} double dist(const node& a,const node& b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} double fenzhi(int l,int r){
double d=inf;
if(l==r) return d;
if(l+==r) return dist(pt[l],pt[r]);
int mid=(l+r)>>;
d=min(fenzhi(l,mid),fenzhi(mid+,r));
cnt=;
int t1,t2,l1=l,r1=mid,mid1;
while(l1<=r1){
mid1=(l1+r1)>>;
if(pt[mid].x-pt[mid1].x<d) r1=mid1-;
else l1=mid1+;
}
t1=l1;
l1=mid+,r1=r;
while(l1<=r1){
mid1=(l1+r1)>>;
if(pt[mid1].x-pt[mid].x<d) l1=mid1+;
else r1=mid1-;
}
t2=r1;
for(int i=t1;i<=t2;++i)
id[++cnt]=i;
sort(id+,id+cnt+,cmp);
for(int i=;i<cnt;++i)
for(int j=i+;j<=cnt&&(pt[id[j]].y-pt[id[i]].y)<d;++j)
d=min(d,dist(pt[id[i]],pt[id[j]]));
return d;
} int main(){
while(scanf("%d",&n),n){
for(int i=;i<=n;++i)
scanf("%lf%lf",&pt[i].x,&pt[i].y);
sort(pt+,pt+n+);
printf("%.2f\n",fenzhi(,n)/);
}
return ;
}

(模板)hdoj1007(分治求平面最小点对)的更多相关文章

  1. poj3714 Raid(分治求平面最近点对)

    题目链接:https://vjudge.net/problem/POJ-3714 题意:给定两个点集,求最短距离. 思路:在平面最近点对基础上加了个条件,我么不访用f做标记,集合1的f为1,集合2的f ...

  2. POJ 3714 分治/求平面最近点对

    第一次见这种问题直接懵圈...没想到分治法这么强大,借鉴了lyd的代码: 代码如下 #include<cstdio> #include<algorithm> #include& ...

  3. TZOJ 1689 Building A New Barn(求平面上有几个其它点求到n个点的曼哈顿距离最小)

    描述 After scrimping and saving for years, Farmer John has decided to build a new barn. He wants the b ...

  4. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  5. 平面最小割—BZOJ 1001

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 很有意思的题目,本来想直接上网络流,但是发现点太多,边太多2333. 直接网络流无法 ...

  6. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  7. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

  8. LG4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...

  9. Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)

    Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...

随机推荐

  1. 1 Java面向对象

    0 工具 在分析面向对象时最好采用UML图进行分析设计 1 Java面向对象的特点 java采用面向对象的方法设计程序主要体现在:对象有属性和方法,事件的发生是对象间的信息交互产生的即程序中的get ...

  2. is(expr|obj|ele|fn)

    is(expr|obj|ele|fn) 概述 根据选择器.DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true.大理石平台支架 如果没有元素符合 ...

  3. toggleClass(class|fn[,sw])

    toggleClass(class|fn[,sw]) 概述 如果存在(不存在)就删除(添加)一个类.直线电机参数   参数 classStringV1.0 CSS类名 class,switchStri ...

  4. word文档的图片怎么保存到ueditor上

    word图片转存,是指UEditor为了解决用户从word中复制了一篇图文混排的文章粘贴到编辑器之后,word文章中的图片数据无法显示在编辑器中,也无法提交到服务器上的问题而开发的一个操作简便的图片转 ...

  5. [Luogu] 计数

    https://www.luogu.org/problemnew/show/P3130 #include <cstdio> #include <iostream> using ...

  6. Java 显示锁 之 重入锁 ReentrantLock(七)

    ReentrantLock 重入锁简介 重入锁 ReentrantLock,顾名思义,就是支持同一个线程对资源的重复加锁.另外,该锁还支持获取锁时的公平与非公平性的选择. 重入锁 ReentrantL ...

  7. HDU 3689 Infinite monkey theorem ——(自动机+DP)

    这题由于是一个单词,其实直接kmp+dp也无妨.建立自动机当然也是可以的.设dp[i][j]表示匹配到第i个字母的时候,在单词中处于第j个位置的概率,因此最终的答案是dp[0~m][len],m是输入 ...

  8. TCP报头格式

    1.端口号:用来标识同一台计算机的不同的应用进程.     1)源端口:源端口和IP地址的作用是标识报文的返回地址.     2)目的端口:端口指明接收方计算机上的应用程序接口. TCP报头中的源端口 ...

  9. Spring AOP常见面试题

    一.AOP是什么? 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编 ...

  10. IO之复制文件的四种方式

    1. 使用FileStreams复制 这是最经典的方式将一个文件的内容复制到另一个文件中. 使用FileInputStream读取文件A的字节,使用FileOutputStream写入到文件B. 这是 ...