题目描述

给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的

输入输出格式

输入格式:
第一行:n;2≤n≤200000

接下来n行:每行两个实数:x y,表示一个点的行坐标和列坐标,中间用一个空格隔开。

输出格式:
仅一行,一个实数,表示最短距离,精确到小数点后面4位。

输入输出样例

输入样例#1:
3
1 1
1 2
2 2
输出样例#1:
1.0000

说明

0<=x,y<=10^9


题解

这是一道分治。
首先,暴力枚举点对计算是n^2,肯定超。
然后数据范围200000,就肯定是nlogn的算法,然后我就想到二分答案,也进行了实现,然后,就没有然后了。。。
于是我就愉快地看了题解,发现确实是二分,可是只是二分区间,然后再合并,就像归并排序。
忽然发现很有道理,因为,点对是两个点,然后就可以分治地去找到满足条件的点对,并更新答案了。
然后,我就写了一遍,还是很好写的,真的很像归并排序求逆序对。
然后我就交了一次:



结果60,我就当场懵逼。。
然后回去看题解,发现他写了实数读入优化,我就copy过来,想着试一试,又交了一次,然后:



wtf,这都行???
还有,为什么还是有一个WA?
于是我就开始看我和他的程序有什么区别,发现排序的函数,他多判了一种x相等时比较y,我就加上了,然后重新交了一次:



还有这种操作???
这么差下来,就是60-100的差距呀,这一般都是算法差距呀。。。。。。。
我只能说,这题太阴险了。。
你们自己可以去体会体会。


至于这题算法具体描述,我懒得自己写了,copy一段(来自@xzyxzy):

于是——怎么分

✔将各个点(结构体)按x的从小到大排序

✔首先运用二分思想将点集合分到最后只剩两个点的时候

✔然后用这两点之间的距离更新答案(答案初始化为无限大)

✔然后我们要找到二分的具体实现方案——每次分到一些点时,找到这些点标号的中间(因为点都排好序了,所以其实也就是找到x轴上一条分界线),将整个点的集合大致均分为两个部分

✔在分界线的右侧,将与分界线的距离小于ans的点纳入到一个辅助结构体里面

✔在分界线的左侧,不断枚举点,枚举到离分界线小于ans的点时,与辅助结构体中的点挨个(等会有解释)判断其距离有没有小于ans,更新ans

注意下用double别掉了精度,然后格式化输出就好了

然后我的代码中,为了避免超时,还是很努力地自己写了个实数的输入优化没想到也过了


最后,贴一下代码:

#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const double eps=0.0001;
double read()
{char ch=getchar();while(ch!='.'&&(ch>'9'||ch<'0')) ch=getchar();int h=0,t=1,b=0;while(ch!='.'&&ch<='9'&&ch>='0'){h=h*10+ch-48;ch=getchar();}if(ch=='.'){ch=getchar();while(ch<='9'&&ch>='0'){b=b*10+ch-48;ch=getchar();t*=10;}}return h+(b*1.000000000)/t;
}
struct point{double x,y;bool operator < (const point& b) const {return x==b.x?y<b.y:x<b.x;}
}p[200001],g[200001];
int n;
inline double getdis(const point& a,const point& b){double cx=b.x-a.x;double cy=b.y-a.y;return sqrt(cx*cx+cy*cy);
}
double ans=inf;
void func(int l,int r){if(l==r){return;}int mid=(l+r)/2;func(l,mid);func(mid+1,r);double line=p[mid].x;int t=1;int cnt=0;for(int i=mid+1;i<=r;i++){if(p[i].x-line<ans){g[++cnt]=p[i];}}for(int i=l;i<=mid;i++){if(line-p[i].x>=ans)continue;while(t<=cnt&&fabs(g[t].y-p[i].y)<ans){ans=min(ans,getdis(p[i],g[t]));t++;}}
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){p[i].x=read();p[i].y=read();}sort(p+1,p+n+1);func(1,n);printf("%.4lf",ans);return 0;
}

end

转载于:https://www.cnblogs.com/stone41123/p/7581291.html

洛谷P1429 平面最近点对(加强版)相关推荐

  1. 洛谷 1429 平面最近点对(加强版) 快排 非点分治或kdtree

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  2. 洛谷千题复习计划(一)(Codeforces + AtCoder)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每天花一个小时简单复习一下我写过的洛谷的题目! 虽然还没有到千题,但是快了(等我复习完这些以后我 lu ...

  3. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  4. 洛谷P1003 铺地毯 noip2011提高组day1T1

    洛谷P1003 铺地毯 noip2011提高组day1T1 洛谷原题 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n ...

  5. 洛谷.4172.[WC2006]水管局长(LCT Kruskal)

    题目链接 洛谷(COGS上也有) 不想去做加强版了..(其实处理一下矩阵就好了) 题意: 有一张图,求一条x->y的路径,使得路径上最长边尽量短并输出它的长度.会有<=5000次删边. 这 ...

  6. 洛谷 深基 第1部分 语言入门 第7章 函数与结构体

    P5735 [深基7.例1]距离函数 [深基7.例1]距离函数 - 洛谷 P5735 [深基7.例1]距离函数(python3实现) P5735 [深基7.例1]距离函数(python3实现)_青少年 ...

  7. 【洛谷】普及练习场 深度优先搜索【易】

    P1219 八皇后 题目大意: 给出一个n*n的正方形棋盘,在上棋盘上放下n个皇后,要求每个皇后所在的行,列,两条对角线上没有其他皇后,输出前三种解法(按字典序排,输出结果从上到下用列号表示),并且最 ...

  8. 洛谷刷题C语言:距离函数、闰年展示、计算阶乘、猴子吃桃、培训

    记录洛谷刷题QAQ 一.[深基7.例1]距离函数 题目描述 给出平面坐标上不在一条直线上三个点坐标 (x1,y1),(x2,y2),(x3,y3)(x_1,y_1),(x_2,y_2),(x_3,y_ ...

  9. 【暑期每日一题】洛谷 P6320 [COCI2006-2007#4] SIBICE

    题目链接:P6320 [COCI2006-2007#4] SIBICE - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 年轻的 Mirko 把火柴扔的到处都是.他的母亲希望 ...

最新文章

  1. h5 一镜到底_传说中的一镜到底效果,到底是怎么玩的?
  2. python--切片
  3. 11g内存管理新特性的internal表现
  4. 一个有趣的python排序模块:bisect
  5. 这篇 CPU Cache,估计要消化一下
  6. 面试题:如何实现丝滑般的数据库扩容
  7. Highcharts custom renderer chart and tooltip
  8. openstack horizon dashboard_陕西高校邦OpenStack云平台实践章节答案
  9. 物联网:发动一场生态系革命
  10. 你知道C#中的Lambda表达式的演化过程吗?
  11. git21天打卡-day5 day6 day7
  12. keras实现DeepDream
  13. webrtc研究资源摘录
  14. iOS TableView性能优化
  15. K-median 算法
  16. 正宇丨你的不自律,会毁了你一辈子
  17. H.265编码视频播放器在播放FLV视频流时出现黑屏,如何解决?
  18. Android 6.0 Marshmallow
  19. 利用Nginxcp为cPanel/WHM服务器开启nginx支持
  20. 约翰·卡马克和他的id Software

热门文章

  1. html中哪些属于块级标记,html行级标记和块级标记都有哪些?
  2. Android获取网页源代码
  3. JSP的MVC模式(JavaBean、Servlet、JSP)
  4. python3 字符串比较_Python3 字符串
  5. sqlinesdata教程_oracle数据库中的表如何能够导入到mysql中?
  6. datagrid底部显示水平滚动_滚动穿透问题探索
  7. sublime text3 sql 格式化
  8. ICML 2019收录774篇论文:谷歌153篇,清华北大26篇
  9. 国内首批AI专业毕业生创办的澎思科技,已完成Pre-A轮融资
  10. Leetcode 1.两数之和