HDU 5721 Palace(平面最近点对(分治))
http://acm.hdu.edu.cn/showproblem.php?pid=5721
n个点,去掉一个点的情况下,最近距离平方之和。
平面最近点对模版题,先求出最近距离,然后找到是哪两个点,然后这个距离乘以n-2 ,然后枚举去掉两个点中的一个,再求平面最近距离,做3次即可,用stl很方便QAQ,记录是哪两个点的时候直接记录坐标,因为中间有排序,记录编号没用。
代码:
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")using namespace std;
#define MAX 100005
#define MAXN 1000005
#define maxnode 15
#define sigma_size 30
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define LL long long
#define ull unsigned long long
#define mem(x,v) memset(x,v,sizeof(x))
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define bits(a) __builtin_popcount(a)
#define mk make_pair
#define limit 10000//const int prime = 999983;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-4;
const LL mod = 1e9+7;
const ull mx = 133333331;/*****************************************************/
inline void RI(int &x) {char c;while((c=getchar())<'0' || c>'9');x=c-'0';while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';}
/*****************************************************/pii a[MAX],b[MAX],c[MAX];bool cmp(pii x,pii y){return x.second<y.second;
}
pair<LL,pair<pii,pii> > closest_pair(pii *A,int n){if(n<=1) return mk(1e18,mk(mk(0,0),mk(0,0)));int m=n/2;int x=A[m].first;pair<LL,pair<pii,pii> > d=min(closest_pair(A,m),closest_pair(A+m,n-m));inplace_merge(A,A+m,A+n,cmp);vector<pii> b;for(int i=0;i<n;i++){if(((LL)A[i].first-x)*((LL)A[i].first-x)>=d.first) continue;for(int j=0;j<b.size();j++){LL dx=A[i].first-b[b.size()-1-j].first;LL dy=A[i].second-b[b.size()-1-j].second;if(dy*dy>=d.first) break;d=min(d,mk(dx*dx+dy*dy,mk(A[i],b[b.size()-1-j])));}b.push_back(A[i]);}return d;
}
int main(){//freopen("in.txt","r",stdin);int t;cin>>t;while(t--){int n;cin>>n;for(int i=0;i<n;i++){int x,y;scanf("%d%d",&x,&y);a[i]=mk(x,y);}LL ans=0;sort(a,a+n);pair<LL,pair<pii,pii> > p=closest_pair(a,n);ans+=(LL)(n-2)*p.first;int tot=0;int flag=0;for(int i=0;i<n;i++){if(a[i]==p.second.first&&!flag){flag=1;continue;}b[tot++]=a[i];}sort(b,b+tot);pair<LL,pair<pii,pii> > q=closest_pair(b,tot);tot=0;ans+=q.first;flag=0;for(int i=0;i<n;i++){if(a[i]==p.second.second&&!flag){flag=1;continue;}c[tot++]=a[i];}sort(c,c+tot);q=closest_pair(c,tot);ans+=q.first;cout<<ans<<endl;}return 0;
}
HDU 5721 Palace(平面最近点对(分治))相关推荐
- 平面最近点对问题(分治)
题目描述 在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点. 依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻. 经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系统唯一的弱点就是能源供应. ...
- HDU-4631 Sad Love Story 平面最近点对
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...
- CF429D Tricky Function(求解公式、经分析转为求平面最近点对、思维)
整理的算法模板合集: ACM模板 目录 CF429D Tricky Function 题意实际上就是给定长度为 nnn 的一串序列a1,a2,...,ana_1, a_2,...,a_na1,a2 ...
- POJ3714 Raid 平面最近点对
利用分治来求平面最近点对 只需要查后面6个点就好了 原因在于https://blog.csdn.net/liufeng_king/article/details/8484284 两个集合的话就把不同集 ...
- 平面最近点对问题求解—基于Java语言
平面最近点对问题求解-基于Java语言 1. 问题描述: 本问题来自<编程之美2.11-寻找最近点对>,文中给出了两种解法:暴力解法,分治解法.其中,暴力解法很简单,求出所有点之间的距离并 ...
- 分治法求平面最近点对入门
一.平面最近点对问题. 平面最近点对:在一个平面上有 n n n个点,求出距离最近的两个点. 平面最近点对是计算几何中一个十分经典且基础的问题,通常采用分治法来解决. 二.直线最近点对的分治法. 在用 ...
- 【算法分析与设计】平面最近点对(含最近距离、最近点对、第一次分割点集合的输出)
[问题描述] 给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小.使用递归与分治策略求解二维平面上的最接近点对问题.假设所有点的集合为S,m为S中所有点的x坐标的中 ...
- 洛谷 1429 平面最近点对(加强版) 快排 非点分治或kdtree
题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...
- HDU1007 查找平面最近点对
求点集中的最近点对有以下两种方法: 设p1=(x1, y1), p2=(x2, y2), -, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对. OJ题目:HDU ...
最新文章
- Python使用matplotlib可视化时间序列数据、并为时间序列曲线添加误差带、使用95%置信区间(Time Series Error Bands with confidence interval
- 【原创】关于部门月会(二)
- Javascript 面向对象全新理练之数据的封装
- 每日一练:Python爬虫爬取全国新冠肺炎疫情数据实例详解,使用beautifulsoup4库实现
- Linux/centos环境下maven安装与配置
- python jupyter安装_python之jupyter的安装
- 4j 设置日志保存天数_MySQL中的这几类日志,你一定要知道
- 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
- 关于Cocos2d-x属性和引用
- python学习-元组tuple(定义、删除、长度、复制、查找、遍历、operator,和列表的区别)
- 基于边缘计算的森林火警监测系统
- 诽谤、窃密、禁令、和解:文远知行创始团队纠纷暂时完结
- 通用版程序在the new iPad与Xcode4.3中的不兼容。
- 依旧是输入输出(存字符矩阵,空格,换行)
- 22个值得收藏的Android开源代码
- ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices (翻译)
- 学习《医学三字经白话解》之咳嗽+疟疾+痢证
- 嵌入式开发—C语言面试题
- Verilog结构描述
- 引谈 | 世界上第一个(真正的)私人家庭安全摄像头诞生!
热门文章
- 瑞吉外卖-新增菜品-异常处理
- 宝付国际公益计划:情牵血液病患儿
- MySQL之怎么查看MySQL语句有没有用到索引
- iOS UITableView 禁止上下滑动
- YDOOK: ANSYS Maxwell 19 教程9:Maxwell 2D 设置边界条件
- Element 表格固定列横向滚动条无法拖动的问题解决
- 程序员团队名称和口号_【工会活动】“强身健体营造温馨团队,心手相牵构建和谐校园” ——记赛罕区民族小学团队拓展活动...
- Android 百度人脸照片对比,百度的人脸对比支持比对同一张照片中的两张脸吗?...
- php酒店订房系统源码,地方酒店预订管理系统BookingE HotelCMS v8.0.97
- vue 打印页面(解决打印预览不全的问题)