题目链接:点击查看

题目大意:给出两个含有n个点的集合,在两个集合中分别任选一点,使得这两个点之间的距离最小

题目分析:因为n给到了1e5,所以n*n的暴力肯定是不行了,直接从网上copy了个分治优化的模板,时间复杂度为nlogn,可以求出n个点中相距最近的两个点的距离,对于这个题目而言,我们将两个集合中的点分个类,在求距离的时候,若是同类的点,直接返回无穷大即可,这样同类的点肯定不可能是答案了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=2e5+100;struct Point
{double x,y;bool flag;
}point[N];int y_sort[N];int cmpx(Point a,Point b)//按照x对这些点从小到大排序
{return a.x<b.x;
}int cmpy(int a,int b)//对最近点算法中的y_sort数组排序
{return point[a].y<point[b].y;
}double dis(Point a,Point b)
{if(a.flag!=b.flag)return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));return 1e20;
}
/*最近点对算法,在point[first]--point[last]个点中寻找一个最短距离使用该算法前先对这些点排序sort(point,point+n,cmpx);
*/
double findMin(int first, int last)
{if((last-first)==1)return dis(point[first],point[last]);else if(last-first==2){double d1 = dis(point[first],point[first+1]);double d2 = dis(point[first],point[first+2]);double d3 = dis(point[first+1],point[first+2]);return min(min(d1,d2),d3);}//二分int mid = (first+last)/2;double min_dist = min(findMin(first,mid),findMin(mid+1,last));if(min_dist==0)return 0;int y_end = 0;for(int i=mid;point[mid].x-point[i].x<min_dist&&i>=first;i--)y_sort[y_end++]=i;for(int i=mid+1;point[i].x-point[mid+1].x<min_dist&&i<=last;i++)y_sort[y_end++]=i;sort(y_sort,y_sort+y_end,cmpy);for(int i=0;i<y_end;i++)for(int j=i+1;j<y_end&&(point[y_sort[j]].y-point[y_sort[i]].y)<min_dist;j++)min_dist=min(min_dist,dis(point[y_sort[i]],point[y_sort[j]]));return min_dist;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){int n;scanf("%d",&n);for(int i=0;i<n;i++){scanf("%lf%lf",&point[i].x,&point[i].y);point[i].flag=true;}for(int i=n;i<2*n;i++){scanf("%lf%lf",&point[i].x,&point[i].y);point[i].flag=false;}sort(point,point+2*n,cmpx);printf("%.3f\n",findMin(0,2*n-1));}return 0;
}

POJ - 3714 Raid(平面最近点对模板题,几何)相关推荐

  1. poj 3714 Raid

    大意:给你一些加油站A的坐标,一些需要基地B的坐标,问你这两者之间的最小值. 思路:用一个标记来表示分别在A和B中,数组长度变大了两倍,然后就是最近点对模板题啦. 另外:输出是%.3f,我用%.3lf ...

  2. POJ - 3714 Raid【分治】【二分】

    [题目描述] After successive failures in the battles against the Union, the Empire retreated to its last ...

  3. POJ3714 Raid 平面最近点对

    利用分治来求平面最近点对 只需要查后面6个点就好了 原因在于https://blog.csdn.net/liufeng_king/article/details/8484284 两个集合的话就把不同集 ...

  4. POJ 1330 Nearest Common Ancestors 【LCA模板题】

    任意门:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000 ...

  5. 最短路 思维转换 POJ 3159需要深刻理解题意的模板题

    Candies Description: 在幼儿园的时候,Flymouse是班上的班长.有时班主任会给班上的孩子们带来一大袋糖果,让他们分发.所有的孩子都非常喜欢糖果,经常比较他们和别人买的糖果的数量 ...

  6. HDU 5721 Palace(平面最近点对(分治))

    http://acm.hdu.edu.cn/showproblem.php?pid=5721 n个点,去掉一个点的情况下,最近距离平方之和. 平面最近点对模版题,先求出最近距离,然后找到是哪两个点,然 ...

  7. 一起开心2020暑假训练第二周 图论(模板题)

    比赛链接: 文章目录 A HDU 1285 一 B HDU 1863 起 C POJ 2387 开 D POJ 1502 心 E HDU 5922 图 F HDU 2112 论 A HDU 1285 ...

  8. 分治应用--最近点对问题 POJ 3714

    文章目录 1. 问题描述 2. 解题思路 3. 实现代码 4. POJ 3714 1. 问题描述 二维平面上有n个点,如何快速计算出两个距离最近的点对? 2. 解题思路 暴力做法是,每个点与其他点去计 ...

  9. CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)

    整理的算法模板合集: ACM模板 目录 CF429D Tricky Function 题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1​,a2​ ...

最新文章

  1. PHP7 - MongoDB Driver 使用心得
  2. 强化学习—— 经验回放(Experience Replay)
  3. matplotlib画散点图
  4. Hadoop辅助工具——Flume、Sqoop
  5. C++的文艺复兴: Why C++? 王者归来
  6. 查最大序号 oracle,oracle查询序号最大的表空间的已经使用空间大小的sql语句
  7. SpringBoot实战(十四):Spring Boot Admin 集成安全模块
  8. springMVC学习(1)
  9. Linux 安全加固大全(合集)
  10. dd 删除引导扇区_硬盘U盘数据怎么用bootice彻底删除及清零引导记录教程
  11. 数据压缩算法—LZ77 vs LZ78
  12. office Word中手动添加MathType插件
  13. linux远程登录命令
  14. 淘宝商品评论获取评论
  15. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explo注册表病毒
  16. 太少的相濡以沫,太多的相忘江湖
  17. 关于使用VMware Workstation Pro16 创建Kali-Linux虚拟环境的操作办法以及库源的配置
  18. 交通行业大数据应用和发展现状
  19. html 图片自动滚动播放,CSS3实现图片滚动播放效果
  20. 最高补贴1000元/kW,山东光伏补贴来了

热门文章

  1. 软件问题造成的经济损失案例_公司印章管理使用哪些行为会造成法律风险隐患...
  2. MySQL select后面的子查询使用
  3. SpringSecurity 权限控制之异常处理流程图
  4. Pod详解-生命周期-概述
  5. zookeeper的名词复盘-会话
  6. PrepareStatement 和Statement 的区别?
  7. Spring MVC 源码分析
  8. RocketMQ消息支持的模式-消息同步发送
  9. RocketMQ的Producer详解之分布式事务消息(代码实现以及过程分析)
  10. SpringBoot-高级-检索-整合SpringDataElasticsearch