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字典方法
本文参考自<python基础教程 (第二版)> 操作 语法 举例 结果 建立字典 dict() 1.以关键字参数建立字典 2.以其他映射作为参数建立字典 1.d = dict(name=' ...
- 关闭 Windows Defender
关闭 Windows Defender Win+R,输入 gpedit.msc 回车,打开组策略编辑器 展开[计算机设置]-[管理模板]-[Windows 组件]-[Windows Defender] ...
- xss攻击的分类
1.反射型XSS 原理: 通过在页面上植入恶意链接,诱使用户点击,执行js脚本,所谓反射型XSS就是将用户输入的数据(恶意用户输入的js脚本),“反射”到浏览器执行. 实例: php源码: <? ...
- FMDB的操作(转),这篇比我写的好
直接看吧 http://blog.devtang.com/blog/2012/04/22/use-fmdb/
- uva120 Stacks of Flapjacks (构造法)
这个题没什么算法,就是想出怎么把答案构造出来就行. 思路:越大的越放在底端,那么每次就找出还没搞定的最大的,把它移到当前还没定好的那些位置的最底端,定好的就不用管了. 这道题要处理好输入,每次输入的一 ...
- Mysql系列:高可用(HA)-keeplived
转自:晓叹星沉 https://my.oschina.net/blueSky4Java/blog/1572905 摘要: 随着项目的发展,为了提高程序的性能,数据库层面或多或少的会用到HA.读写分离. ...
- C++中声明和定义的区别
声明 这有一个与这个名字相关的东西,并且它是这个类型的,告诉编译器我要使用它,并期待它定义在某一个地方. 定义 定义是指提供所有必要的信息(占用内存大小),使其能够创建整个实体. 我们必须明白的: 一 ...
- stl_relops.h
stl_relops.h // Filename: stl_relops.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog: http ...
- python之ConfigParser的使用。
一.ConfigParser简介 ConfigParser 是用来读取配置文件的包.配置文件的格式如下:中括号“[ ]”内包含的为section.section 下面为类似于key-value 的配置 ...
- python并发编程的几种方法
1.多线程 Threading模块 2.2.6版本以后 多进程 multiprocessing模块 3.协程 gevent (是一个基于libev的并发库.它为各种并发和网络相关的任务提供了整洁的AP ...