第一次见这种问题直接懵圈。。。没想到分治法这么强大,借鉴了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 分治/求平面最近点对的更多相关文章

  1. poj3714 Raid(分治求平面最近点对)

    题目链接:https://vjudge.net/problem/POJ-3714 题意:给定两个点集,求最短距离. 思路:在平面最近点对基础上加了个条件,我么不访用f做标记,集合1的f为1,集合2的f ...

  2. poj 3714 Raid(平面最近点对)

    Raid Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 7473   Accepted: 2221 Description ...

  3. POJ 3741 Raid (平面最近点对)

    $ POJ~3741~Raid $ (平面最近点对) $ solution: $ 有两种点,现在求最近的平面点对.这是一道分治板子,但是当时还是想了很久,明明知道有最近平面点对,但还是觉得有点不对劲. ...

  4. (模板)hdoj1007(分治求平面最小点对)

    题目链接:https://vjudge.net/problem/HDU-1007 题意:给定n个点,求平面距离最小点对的距离除2. 思路:分治求最小点对,对区间[l,r]递归求[l,mid]和[mid ...

  5. POJ 3714 Raid(平面近期点对)

    解题思路: 分治法求平面近期点对.点分成两部分,加个标记就好了. #include <iostream> #include <cstring> #include <cst ...

  6. POJ 3714 Raid(计算几何の最近点对)

    Description After successive failures in the battles against the Union, the Empire retreated to its ...

  7. 【POJ 3714】 Raid

    [题目链接] http://poj.org/problem?id=3714 [算法] 分治求平面最近点对 [代码] #include <algorithm> #include <bi ...

  8. Vijos 1012 清帝之惑之雍正 平面最近点对(分治)

    背景 雍正帝胤祯,生于康熙十七年(1678)是康熙的第四子.康熙61年,45岁的胤祯继承帝位,在位13年,死于圆明园.庙号世宗. 胤祯是在康乾盛世前期--康熙末年社会出现停滞的形式下登上历史舞台的.复 ...

  9. wannafly 练习赛11 E 求最值(平面最近点对)

    链接:https://www.nowcoder.com/acm/contest/59/E 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit ...

随机推荐

  1. hdu 5239 Doom(线段树)

    Doom Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Sub ...

  2. Asp.net 异步调用WebService

    //服务代码 [WebMethod] public string Test(int sleepTimes, int val) { Thread.Sleep(sleepTimes); var log = ...

  3. 22 Python 模块与包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  4. Agc007_C Pushing Balls

    传送门 题目大意 在一条直线上有$N$个球和$N+1$个洞,每两个球之间有一个洞,每两个洞之间有一个球,最左端和最右端都是洞,其中产生的$2N$个间隔满足从左到右是等差数列.你每次随机选择一个未被推进 ...

  5. ZOJ Anagrams by Stack(堆栈中的搜索)

    个人心得:算法书中的第一个例题就来了一个下马威,虽然题意很好理解但是做起来确实这么不顺手,所以自己对于搜索和堆栈理解的并不是很好, 以前也是很多这样的题目无法实施,这题要做的很明确就是输出正确的能依靠 ...

  6. 橱窗布置(Flower)(动规)

    橱窗布置(Flower) [问题描述]         假设以最美观的方式布置花店的橱窗,有F束花,每束花的品种都不一样,同时,至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,并从左到右, ...

  7. java 连接oracle数据库

    package shujuku; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepared ...

  8. 基于Python语言使用RabbitMQ消息队列(二)

    工作队列 在第一节我们写了程序来向命名队列发送和接收消息 .在本节我们会创建一个工作队列(Work Queue)用来在多个工人(worker)中分发时间消耗型任务(time-consuming tas ...

  9. unity3d___UGui中如何创建loading...进度条

    http://blog.sina.com.cn/s/blog_e82e8c390102wh2z.html 实现方法:通过Image组件中Image Type属性中Fill Amount,通过代码改变F ...

  10. 学习动态性能表(20)--v$waitstat

    学习动态性能表 第20篇--V$WAITSTAT  2007.6.15 本视图保持自实例启动所有的等待事件统计信息.常用于当你发现系统存在大量的"buffer busy waits" ...