POJ 3741 Raid (平面最近点对)
$ POJ3741Raid $ (平面最近点对)

$ solution: $
有两种点,现在求最近的平面点对。这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲。基本算法专题出最近平面点对?怎么感觉我 $ Noip $ 凉了? 这题不会是个坑吧。。。。
嗯,不瞎扯了。来回顾一下分治求平面点对的过程,首先将点按横坐标排序,然后整个区间不断往下二分,回溯的时候归并排序(这其实我来再写一次题解的原因,以前写的都是快排,但必须承认归并的复杂度才是最稳最准的)。我们将两个区间合并时,从中间点想外扩 $ d $ 的距离,这个距离内的点才有可能更新答案,而且这个距离里的每个点都不会计算多次,这个是有证明的 。然后我们暴力计算即可。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define rg register int
using namespace std;
int t,n;
struct su{
db x,y;
bool z;
inline bool operator <(const su &yy){
return x<yy.x;
}
}a[200005],b[200005];
inline int qr(){
register char ch; register bool sign=0; rg res=0;
while(!isdigit(ch=getchar()))if(ch=='-')sign=1;
while(isdigit(ch))res=res*10+(ch^48),ch=getchar();
if(sign)return -res; else return res;
}
inline db dis(const su &x,const su &y){
return pow((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y),0.5);
}
inline db ask(int sl,int sr){
if(sl==sr)return 1e9;
rg mid=(sl+sr)>>1;
db d=min(ask(sl,mid),ask(mid+1,sr));
rg l=sl,r=mid+1,tt=sl;
while(l<=mid&&r<=sr)
if(a[l].y<a[r].y)b[tt++]=a[l++];
else b[tt++]=a[r++];
while(l<=mid)b[tt++]=a[l++];
while(r<=sr)b[tt++]=a[r++];
for(rg i=r=sl;i<tt;++i){ a[i]=b[i];
if(fabs(b[i].x-b[mid].x)>d)continue;
while(r<=sr&&b[r].y-b[l].y<=d)++r;
for(rg j=i+1;j<r;++j)
if(b[j].z!=b[i].z&&fabs(b[j].x-b[mid].x)<=d)//这里不能少
d=min(d,dis(b[i],b[j]));
}return d;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
t=qr();
while(t--){
n=qr();
for(rg i=1;i<=n;++i)
a[i].x=qr(),a[i].y=qr(),a[i].z=1;
for(rg i=n+1;i<=n<<1;++i)
a[i].x=qr(),a[i].y=qr();
sort(a+1,a+2*n+1);
printf("%.3lf\n",ask(1,2*n));
}
return 0;
}
POJ 3741 Raid (平面最近点对)的更多相关文章
- 『Raid 平面最近点对』
平面最近点对 平面最近点对算是一个经典的问题了,虽然谈不上是什么专门的算法,但是拿出问题模型好好分析一个是有必要的. 给定\(n\)个二元组\((x,y)\),代表同一平面内的\(n\)个点的坐标,求 ...
- POJ-3714 Raid 平面最近点对
题目链接:http://poj.org/problem?id=3714 分治算法修改该为两个点集的情况就可以了,加一个标记... //STATUS:C++_AC_2094MS_4880KB #incl ...
- 【POJ3714】Raid:平面最近点对
Description After successive failures in the battles against the Union, the Empire retreated to its ...
- 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 # ...
- POJ 3714 Raid
Description After successive failures in the battles against the Union, the Empire retreated to its ...
- 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点
平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...
- HDU-4631 Sad Love Story 平面最近点对
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...
- HDU1007--Quoit Design(平面最近点对)
Problem Description Have you ever played quoit in a playground? Quoit is a game in which flat rings ...
随机推荐
- Python可变数据类型list填坑一则
前提概要 最近写业务代码时遇到一个列表的坑,在此记录一下. 需求 现在有一个普通的rule列表: rule = [["ID",">",0]] 在其他地方经 ...
- 四十一、python面向对象二
A.成员: 1.字段:静态字段(每个对象都有同一字段),普通字典(每个对象都有不同的数据) 2.方法:静态方法(无需使用对象的内容),类方法,普通方法(使用对象中的数据) 3.特性:普通特性(将方法伪 ...
- 硬件-硬盘-SSD(固态硬盘):百科
ylbtech-硬件-硬盘-SSD(固态硬盘):百科 固态驱动器(Solid State Disk或Solid State Drive,简称SSD),俗称固态硬盘,固态硬盘是用固态电子存储芯片阵列而制 ...
- python 接口测试时,后端报错no String-argument constructor/factory method
解决方法: 1.先将字典转化为序列化的数据类型 data = {"pageNo":0,"pageSize":10,"shopId":15,& ...
- DELPHI中函数、过程变量的声明与应用
Procedure型变量: 在DELPHI中,函数.过程的地址可以赋给一个特殊类型的变量,变量可用如下方式声明: var p : procedure(num:integer); //过程 或: var ...
- python里一个class可以定义多个构造函数
不行,一个class只能有一个用于构造对象的__init__函数但python中的变量是无类型的,因此传给__init__的参数可以是任何类型python中的函数参数在定义时可以有默认值,可以让__i ...
- python接口自动化:requests+ddt+htmltestrunner数据驱动框架
该框架分为四个包:xc_datas.xc_driven.xc_report.xc_tools. xc_datas:存放数据,xc_driven:存放执行程序,xc_report:存放生成的报告,xc_ ...
- 深度学习之美(张玉宏)——第四章 人生苦短我用python
1 函数参数 (1)收集参数:以一个星号*加上形参名的方式,表示这个函数的实参个数不定,可能0个可能n个. def varParaFun(name,*param): print('位置参数是:',na ...
- python winsound模块
(目标:出现交易下单.结束成交.数据中断等信号的时候,PC 发出声音提醒.) python winsound模块 winsound是Python的内置包,无需下载.可以直接通过 import wins ...
- [转帖]深入理解 MySQL—锁、事务与并发控制
深入理解 MySQL—锁.事务与并发控制 http://www.itpub.net/2019/04/28/1723/ 跟oracle也类似 其实所有的数据库都有相同的机制.. 学习了机制才能够更好的工 ...