平面最近点对(分治nlogn)
平面最近点对,是指给出平面上的n个点,寻找点对间的最小距离
首先可以对按照x为第一关键字排序,然后每次按照x进行分治,左边求出一个最短距离d1,右边也求出一个最短距离d2,那么取d=min(d1, d2)
然后只需考虑横跨左右两侧的点,不妨枚举左侧的点pi
那么很显然的是如果pi距离中间的点超过了d,便可以直接舍去,只需考虑距离中间点小于d的点
这样一来就可以对每个pi画一个边长为2d的正方形,易证,矩形内最多存在8个点。
那么关键问题就是要快速找这8个点
朴素做法是对分治后的点进行快排,这样复杂度就是nlognlogn
但是我们如果结合归并排序,每一次分治的过程顺带就按y归并排序,便可以把logn省掉了 (%%%想出做法的和鑫神犇)
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
struct P
{
int x, y;
bool operator <(const P& B)const { return x < B.x; }
}p[];
int dis(P &A, P &B) { return (A.x-B.x)*(A.x-B.x) + (A.y-B.y)*(A.y-B.y); }
P Q[];
int Divide(int l, int r)
{
if(l == r) return 1e7;
int mid = (l+r)>>, d, tx = p[mid].x, tot = ;
d = min(Divide(l, mid), Divide(mid+, r));
for(int i = l, j = mid+; (i <= mid || j <= r); i++)
{
while(j <= r && (p[i].y > p[j].y || i > mid)) Q[tot++] = p[j], j++; //归并按y排序
if(abs(p[i].x - tx) < d && i <= mid) //选择中间符合要求的点
{
for(int k = j-; k > mid && j-k < ; k--) d = min(d, dis(p[i], p[k]));
for(int k = j; k <= r && k-j < ; k++) d = min(d, dis(p[i], p[k]));
}
if(i <= mid) Q[tot++] = p[i];
}
for(int i = l, j = ; i <= r; i++, j++) p[i] = Q[j];
return d;
} int main()
{
int n;
cin>>n;
for(int i = ; i <= n; i++) cin>>p[i].x>>p[i].y;
sort(p+, p++n);
cout<<Divide(, n)<<endl;
}
注意:这里只选了坐标为整数的点,而且范围较小,需要一定的更改才能使用
平面最近点对(分治nlogn)的更多相关文章
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
		
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
 - Vijos 1012 清帝之惑之雍正 平面最近点对(分治)
		
背景 雍正帝胤祯,生于康熙十七年(1678)是康熙的第四子.康熙61年,45岁的胤祯继承帝位,在位13年,死于圆明园.庙号世宗. 胤祯是在康乾盛世前期--康熙末年社会出现停滞的形式下登上历史舞台的.复 ...
 - Luogu 1429 平面最近点对 | 平面分治
		
Luogu 1429 平面最近点对 题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 ...
 - Luogu P1429 平面最近点对(加强版)(分治)
		
P1429 平面最近点对(加强版) 题意 题目描述 给定平面上\(n\)个点,找出其中的一对点的距离,使得在这\(n\)个点的所有点对中,该距离为所有点对中最小的. 输入输出格式 输入格式: 第一行: ...
 - P1429 平面最近点对(加强版)(分治)
		
P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心, ...
 - poj3714 Raid(分治求平面最近点对)
		
题目链接:https://vjudge.net/problem/POJ-3714 题意:给定两个点集,求最短距离. 思路:在平面最近点对基础上加了个条件,我么不访用f做标记,集合1的f为1,集合2的f ...
 - $Poj3714/AcWing\ Raid$ 分治/平面最近点对
		
$AcWing$ $Sol$ 平面最近点对板子题,注意要求的是两种不同的点之间的距离. $Code$ #include<bits/stdc++.h> #define il inline # ...
 - HDU1007--Quoit Design(平面最近点对)
		
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
 - HDU-4631 Sad Love Story 平面最近点对
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...
 
随机推荐
- 大数据入门第十七天——storm上游数据源 之kafka详解(二)常用命令
			
一.kafka常用命令 1.创建topic bin/kafka-topics. --replication-factor --zookeeper mini1: // 如果配置了PATH可以省略相关命令 ...
 - 20155328 《网络攻防》 实验一:PC平台逆向破解(5)M
			
20155328 <网络攻防> 实验一:PC平台逆向破解(5)M 实践目标 实践对象:linux可执行文件pwn1. 正常执行时,main调用foo函数,foo函数会简单回显任何用户输入的 ...
 - SQL面试整理(1)——数据库连接池
			
在web开发中,如果JSP.Servlet或EJB使用JDBC直接访问数据库,每一次数据访问请求都必须经历建立数据库连接,打开数据库,存取数据库和关闭数据库连接等操作步骤,如果频繁发生这种数据库操作, ...
 - springboot @PropertySource
			
@ConfigurationProperties(prefix="person") 默认加载全局配置文件 application.properties或application.ym ...
 - 【ORACLE】重写控制文件
			
[oracle@rac01 ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Thu Mar 15 23:45:02 ...
 - GitHub 新手教程 四,Git GUI 新手教程(1),OpenSSH Public Key
			
1,从开始菜单 启动 Git GUI,或者运行: D:\soft\Git\cmd\git-gui.exe(D:\soft\Git 为您的 GitHub 安装文件夹) 2,获取 SSH 密钥: 3,点击 ...
 - mssql循环记录之while方法
			
1.定义变量 Declare @i Int 2.获取单条记录 Select @i=Min([id]) From [数据库名] Where <检索条件> 3.While循环 While @i ...
 - 【URLOS应用开发基础】10分钟制作一个nginx静态网站环境应用
			
URLOS开发者功能已上线有一段时间了,目前通过部分开发者的使用体验来看,不得不说URLOS在服务器软件开发效率方面确实有着得天独厚的优势,凭借docker容器技术与其良好的应用生态环境,URLOS必 ...
 - 详细聊聊k8s deployment的滚动更新(一)
			
一.知识准备 ● 本文详细探索deployment在滚动更新时候的行为 二.环境准备 组件 版本 OS Ubuntu 18.04.1 LTS docker 18.06.0-ce 三.准备镜像 首先准备 ...
 - 绕过用编码方式阻止XSS攻击的几个例子
			
阻止攻击的常用方法是:在将HTML返回给Web浏览器之前,对攻击者输入的HTML进行编码.HTML编码使用一些没有特定HTML意义的字符来代替那些标记字符(如尖括号).这些替代字符不会影响文本在web ...