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(平面最近点对(分治))相关推荐

  1. 平面最近点对问题(分治)

    题目描述 在与联盟的战斗中屡战屡败后,帝国撤退到了最后一个据点. 依靠其强大的防御系统,帝国击退了联盟的六波猛烈进攻. 经过几天的苦思冥想,联盟将军亚瑟终于注意到帝国防御系统唯一的弱点就是能源供应. ...

  2. HDU-4631 Sad Love Story 平面最近点对

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近 ...

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

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

  4. POJ3714 Raid 平面最近点对

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

  5. 平面最近点对问题求解—基于Java语言

    平面最近点对问题求解-基于Java语言 1. 问题描述: 本问题来自<编程之美2.11-寻找最近点对>,文中给出了两种解法:暴力解法,分治解法.其中,暴力解法很简单,求出所有点之间的距离并 ...

  6. 分治法求平面最近点对入门

    一.平面最近点对问题. 平面最近点对:在一个平面上有 n n n个点,求出距离最近的两个点. 平面最近点对是计算几何中一个十分经典且基础的问题,通常采用分治法来解决. 二.直线最近点对的分治法. 在用 ...

  7. 【算法分析与设计】平面最近点对(含最近距离、最近点对、第一次分割点集合的输出)

    [问题描述] 给定二维平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小.使用递归与分治策略求解二维平面上的最接近点对问题.假设所有点的集合为S,m为S中所有点的x坐标的中 ...

  8. 洛谷 1429 平面最近点对(加强版) 快排 非点分治或kdtree

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  9. HDU1007 查找平面最近点对

    求点集中的最近点对有以下两种方法: 设p1=(x1, y1), p2=(x2, y2), -, pn=(xn, yn)是平面上n个点构成的集合S,设计算法找出集合S中距离最近的点对. OJ题目:HDU ...

最新文章

  1. Python使用matplotlib可视化时间序列数据、并为时间序列曲线添加误差带、使用95%置信区间(Time Series Error Bands with confidence interval
  2. 【原创】关于部门月会(二)
  3. Javascript 面向对象全新理练之数据的封装
  4. 每日一练:Python爬虫爬取全国新冠肺炎疫情数据实例详解,使用beautifulsoup4库实现
  5. Linux/centos环境下maven安装与配置
  6. python jupyter安装_python之jupyter的安装
  7. 4j 设置日志保存天数_MySQL中的这几类日志,你一定要知道
  8. 大工13秋《专业英语(计算机英语)》在线测试2,大工13秋《专业英语(计算机英语)》在线测试2答案...
  9. 关于Cocos2d-x属性和引用
  10. python学习-元组tuple(定义、删除、长度、复制、查找、遍历、operator,和列表的区别)
  11. 基于边缘计算的森林火警监测系统
  12. 诽谤、窃密、禁令、和解:文远知行创始团队纠纷暂时完结
  13. 通用版程序在the new iPad与Xcode4.3中的不兼容。
  14. 依旧是输入输出(存字符矩阵,空格,换行)
  15. 22个值得收藏的Android开源代码
  16. ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices (翻译)
  17. 学习《医学三字经白话解》之咳嗽+疟疾+痢证
  18. 嵌入式开发—C语言面试题
  19. Verilog结构描述
  20. 引谈 | 世界上第一个(真正的)私人家庭安全摄像头诞生!

热门文章

  1. 瑞吉外卖-新增菜品-异常处理
  2. 宝付国际公益计划:情牵血液病患儿
  3. MySQL之怎么查看MySQL语句有没有用到索引
  4. iOS UITableView 禁止上下滑动
  5. YDOOK: ANSYS Maxwell 19 教程9:Maxwell 2D 设置边界条件
  6. Element 表格固定列横向滚动条无法拖动的问题解决
  7. 程序员团队名称和口号_【工会活动】“强身健体营造温馨团队,心手相牵构建和谐校园” ——记赛罕区民族小学团队拓展活动...
  8. Android 百度人脸照片对比,百度的人脸对比支持比对同一张照片中的两张脸吗?...
  9. php酒店订房系统源码,地方酒店预订管理系统BookingE HotelCMS v8.0.97
  10. vue 打印页面(解决打印预览不全的问题)