POJ 3714 分治/求平面最近点对
第一次见这种问题直接懵圈。。。没想到分治法这么强大,借鉴了lyd的代码:
代码如下
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const int maxn=;
struct point{
int x,y,z;
};
point a[maxn],b[maxn];
int n,m,t,i;
double ans=;
bool cmp(point a1,point a2){
return a1.x<a2.x;
}
double dist(point a1,point a2){
return sqrt(1.0*(a1.x-a2.x)*(a1.x-a2.x)+1.0*(a1.y-a2.y)*(a1.y-a2.y));
}
void merge(int l,int mid,int r){//按照y坐标排序,分治法
int i=l,j=mid+,k;
for(k=l;k<=r;k++){//两个部分已经按y坐标排好序,直接合并
if(j>r||i<=mid&&a[i].y<a[j].y)b[k]=a[i++];
else b[k]=a[j++];
}
for(k=l;k<=r;k++)a[k]=b[k];
}
void solve(int l,int r){
if(l==r)return;//分治边界
int mid=(l+r)>>,p=,x=a[mid].x,i,j;
solve(l,mid);//解决左半部分
solve(mid+,r);//右半部分
merge(l,mid,r);//合并
for(i=l;i<=r;i++){//排除不肯能选项
if(abs(a[i].x-x)<=ans)b[++p]=a[i];
}
for(i=;i<p;i++)
for(j=i+;j<=p;j++){
if(b[j].y-b[i].y<ans){//y坐标之差小于ans才有可能是
if(b[i].z!=b[j].z)//如果不在一个集合
ans=min(ans,dist(b[i],b[j]));
}
else//若这个不行,后面的肯定也不行
break;
}
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(i=;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),a[i].z=;
for(i=n+,n*=;i<=n;i++)scanf("%d%d",&a[i].x,&a[i].y),a[i].z=;
ans=dist(a[],a[n]);
sort(a+,a++n,cmp);//根据x坐标排序
solve(,n);
printf("%.3f\n",ans);
}
}
POJ 3714 分治/求平面最近点对的更多相关文章
- poj3714 Raid(分治求平面最近点对)
题目链接:https://vjudge.net/problem/POJ-3714 题意:给定两个点集,求最短距离. 思路:在平面最近点对基础上加了个条件,我么不访用f做标记,集合1的f为1,集合2的f ...
- poj 3714 Raid(平面最近点对)
Raid Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7473 Accepted: 2221 Description ...
- POJ 3741 Raid (平面最近点对)
$ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...
- (模板)hdoj1007(分治求平面最小点对)
题目链接:https://vjudge.net/problem/HDU-1007 题意:给定n个点,求平面距离最小点对的距离除2. 思路:分治求最小点对,对区间[l,r]递归求[l,mid]和[mid ...
- POJ 3714 Raid(平面近期点对)
解题思路: 分治法求平面近期点对.点分成两部分,加个标记就好了. #include <iostream> #include <cstring> #include <cst ...
- POJ 3714 Raid(计算几何の最近点对)
Description After successive failures in the battles against the Union, the Empire retreated to its ...
- 【POJ 3714】 Raid
[题目链接] http://poj.org/problem?id=3714 [算法] 分治求平面最近点对 [代码] #include <algorithm> #include <bi ...
- Vijos 1012 清帝之惑之雍正 平面最近点对(分治)
背景 雍正帝胤祯,生于康熙十七年(1678)是康熙的第四子.康熙61年,45岁的胤祯继承帝位,在位13年,死于圆明园.庙号世宗. 胤祯是在康乾盛世前期--康熙末年社会出现停滞的形式下登上历史舞台的.复 ...
- wannafly 练习赛11 E 求最值(平面最近点对)
链接:https://www.nowcoder.com/acm/contest/59/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...
随机推荐
- python之单元测试框架—unittest
一. 什么是单元测试?单元测试的对象是什么? 1: 什么是单元测试? 按照定义,单元测试就是对单个模块或者单个类或者单个函数进行测试,一般是开发做的,按照阶段分,一般就是单元测试.集成测试.系统测试. ...
- CodeForces 444C 线段树
想分块想了很久一点思路都没有,结果一看都是写的线段树= = ...完全忘记了还有线段树这种操作 题意:给一个数组,一种操作是改变l到r为c,还有一种操作是查询l到r的总和差 线段树记得+lazy标记 ...
- HANA 存储过程
You can develop secure procedures using SQLScript in SAP HANA by observing the following recommendat ...
- New Concept English three (54)
打字练习: 27w/m 45errors We have been brought up to fear insects. We regard them as unnecessary creature ...
- Python中类的约束
如何在python中进行类的约束 使某些类必须有一些方法 1 python 的抽象类实现 === 约束性不高 Python是 解释性语言 from abc import ABCMeta from ab ...
- linux shell 学习笔记--内部命令学习
.基本命令 新手必须要掌握的初级命令 ls 基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如 ,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, ...
- C++ const 常量和常指针
常量,该指针所指向的值为只读 ; const int * p = &a; 常指针,该指针的值为只读,不可再指向其他地址 const * const p = &a; 常值,常指针 con ...
- 树莓派相机操作 —— luvcview 的安装、raspistill:摄像头命令
MMAL (Multimedia Abstraction Layer) RaspiCam Documentation 0. lucview 的安装 安装命令:sudo apt-get install ...
- 排序算法 java实现2
继续排序算法 4.冒泡排序 从第一个开始,跟后面一个数比较,如果比后面大就交换位置,这样没完成一轮,就可以把最大的选出来 public static <T extends Comparable& ...
- UVA - 11916 Emoogle Grid (组合计数+离散对数)
假如有这样一道题目:要给一个M行N列的网格涂上K种颜色,其中有B个格子不用涂色,其他每个格子涂一种颜色,同一列中的上下两个相邻格子不能涂相同颜色.给出M,N,K和B个格子的位置,求出涂色方案总数除以1 ...