[计算几何][分治]luogu P1429 平面最近点对(加强版)
时间:2020-10-21
本文章向大家介绍[计算几何][分治]luogu P1429 平面最近点对(加强版),主要包括[计算几何][分治]luogu P1429 平面最近点对(加强版)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题面
https://www.luogu.com.cn/problem/P1429
分析
考虑分治法
对x排序,设mid为x中位数的直线
设当前已经处理出x为1..mid,mid+1..r中的最近点对距离dist
那么新产生的最近点对必然跨过mid,即x坐标在mid-dist..mid+dist中
考虑在左侧选择一个点,那么可选的区域为一个半径为dist的圆,为了方便理解,我们将其处理为一个边长为2*dist的正方形
而这个正方形跨过mid的部分最大只能是一个宽为dist,长为2*dist的矩形
而前文提到过,最近点对距离已经为dist,所以该矩形中最多出现6个点,即每次对于选择的点,在另一侧中可以选择的点最多为6个
然后仍然是最近点对距离为dist,所以将所有点投影到x=mid的直线上,将纵向距离小于dist且位于另一侧的点与之配对,记录最小值
即按y值排序
排序复杂度为O(nlogn),所以总复杂度为O(nlog^2n)
代码
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; const ll Inf=1ll<<62; const int N=2e6+10; struct Point { ll x,y; }p[N]; int n; bool CMP_X(Point a,Point b) {return a.x<b.x;} bool CMP_Y(Point a,Point b) {return a.y<b.y;} inline ll Dist(Point a,Point b) {return pow(a.x-b.x,2)+pow(a.y-b.y,2);} ll Calc(int l,int r) { if (r-l==0) return Inf; if (r-l==1) return Dist(p[l],p[r]); if (r-l==2) return min(Dist(p[l],p[r]),min(Dist(p[l],p[l+1]),Dist(p[r-1],p[r]))); int mid=l+r>>1; ll mn=min(Calc(l,mid),Calc(mid+1,r)); sort(p+l,p+r+1,CMP_X); int dl=mid,dr=mid; while (dl>=l&&pow(p[dl].x-p[mid].x,2)<=mn) dl--;dl++; while (dr<=r&&pow(p[dr].x-p[mid].x,2)<=mn) dr++;dr--; if (dl<=dr) sort(p+dl,p+dr+1,CMP_Y); for (int i=dl;i<dr;i++) for (int j=i+1;j<=min(i+7,dr);j++) mn=min(mn,Dist(p[i],p[j])); return mn; } int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%lld%lld",&p[i].x,&p[i].y); sort(p+1,p+n+1,CMP_X); printf("%.4lf",1.0*sqrt(Calc(1,n))); }
原文地址:https://www.cnblogs.com/mastervan/p/13855001.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 精讲RestTemplate第3篇-GET请求使用方法详解
- 通过JSch运行远程linux主机上的shell脚本
- 精讲RestTemplate第5篇-DELETE、PUT等请求方法使用详解
- 一个小小的签到功能,到底用MySQL还是Redis?
- 在IntelliJ IDEA中多线程并发代码的调试方法
- 使用java API进行zip递归压缩文件夹以及解压
- C#刷剑指Offer | 从上到下打印二叉树
- Java自动化测试(web自动化测试框架2 29)
- 精讲RestTemplate第9篇-如何通过HTTP Basic Auth认证
- 【Rust日报】2020-09-14 测试数据表明, Rust 可以帮你省钱!
- 【43期】盘点那些必问的数据结构算法题之二叉树基础
- 精讲RestTemplate第8篇-请求失败自动重试机制
- 精讲RestTemplate第7篇-自定义请求失败异常处理
- 精讲RestTemplate第10篇-使用代理作为跳板发送请求
- 精讲响应式WebClient第5篇-请求超时设置与异常处理