题解:直接在输入点对的基础上建立 kd-tree,再每次以每个节点的坐标查询离这个点最近的点即可,同时需要忽略这个点本身对该点答案的贡献。

另外,直接在这些点上建立 kd-tree 会比一个一个插入点建立的更平衡,直接插入由于缺少了 nth_element 的划分,导致树很容易退化。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
inline double sqr(double val){return val*val;} struct node{
#define ls(x) t[x].lc
#define rs(x) t[x].rc
int lc,rc;
double p[2],x[2],y[2];
}t[maxn];
int root,d;double ans;
inline bool cmp(const node &x,const node &y){return x.p[d]<y.p[d];}
inline double getdis(int o,double x,double y){
return sqr(max((double)0,max(t[o].x[0]-x,x-t[o].x[1])))+sqr(max((double)0,max(t[o].y[0]-y,y-t[o].y[1])));
}
inline void pushup(int o){
t[o].x[0]=min(t[o].p[0],min(t[ls(o)].x[0],t[rs(o)].x[0]));
t[o].x[1]=max(t[o].p[0],max(t[ls(o)].x[1],t[rs(o)].x[1]));
t[o].y[0]=min(t[o].p[1],min(t[ls(o)].y[0],t[rs(o)].y[0]));
t[o].y[1]=max(t[o].p[1],max(t[ls(o)].y[1],t[rs(o)].y[1]));
}
int build(int l,int r,int now){
if(l>r)return 0;
int mid=l+r>>1;
d=now,nth_element(t+l,t+mid,t+r+1,cmp);
ls(mid)=build(l,mid-1,now^1),rs(mid)=build(mid+1,r,now^1);
return pushup(mid),mid;
}
void query(int o,double x,double y,int idx){
double dn=sqr(x-t[o].p[0])+sqr(y-t[o].p[1]),dl,dr;
if(o!=idx)ans=min(ans,dn);
dl=ls(o)?getdis(ls(o),x,y):4e18;
dr=rs(o)?getdis(rs(o),x,y):4e18;
if(dl<dr){
if(dl<ans)query(ls(o),x,y,idx);
if(dr<ans)query(rs(o),x,y,idx);
}else{
if(dr<ans)query(rs(o),x,y,idx);
if(dl<ans)query(ls(o),x,y,idx);
}
}
void init(){ans=4e18,t[0].x[0]=t[0].y[0]=4e18,t[0].x[1]=t[0].y[1]=-4e18;} int n;double p[2];
int main(){
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lf%lfd",&t[i].p[0],&t[i].p[1]);
root=build(1,n,0);
for(int i=1;i<=n;i++)query(root,t[i].p[0],t[i].p[1],i);
printf("%.4lf\n",sqrt(ans));
return 0;
}

【洛谷P1429】平面最近点对的更多相关文章

  1. (洛谷 P1429 平面最近点对(加强版) || 洛谷 P1257 || Quoit Design HDU - 1007 ) && Raid POJ - 3714

    这个讲的好: https://phoenixzhao.github.io/%E6%B1%82%E6%9C%80%E8%BF%91%E5%AF%B9%E7%9A%84%E4%B8%89%E7%A7%8D ...

  2. 洛谷 P1429 平面最近点对(加强版) (分治模板题)

    题意:有\(n\)个点对,找到它们之间的最短距离. 题解:我们先对所有点对以\(x\)的大小进行排序,然后分治,每次左右二等分递归下去,当\(l+1=r\)的时候,我们计算一下距离直接返回给上一层,若 ...

  3. 洛谷1429 平面最近点对(KDTree)

    qwq(明明可以直接分治过掉的) 但是还是当作联系了 首先,对于这种点的题,很显然的套路,我们要维护一个子树\(mx[i],mn[i]\)分别表示每个维度的最大值和最小值 (这里有一个要注意的东西!就 ...

  4. Luogu P1429 平面最近点对(加强版)(分治)

    P1429 平面最近点对(加强版) 题意 题目描述 给定平面上\(n\)个点,找出其中的一对点的距离,使得在这\(n\)个点的所有点对中,该距离为所有点对中最小的. 输入输出格式 输入格式: 第一行: ...

  5. P1429 平面最近点对(加强版)(分治)

    P1429 平面最近点对(加强版) 主要思路: 分治,将点按横坐标为第1关键字升序排列,纵坐标为第2关键字升序排列,进入左半边和右半边进行分治. 设d为左右半边的最小点对值.然后以mid这个点为中心, ...

  6. P1429 平面最近点对[加强版] 随机化

    LINK:平面最近点对 加强版 有一种分治的做法 因为按照x排序分治再按y排序 可以证明每次一个只会和周边的六个点进行更新. 好像不算很难 这里给出一种随机化的做法. 前置知识是旋转坐标系 即以某个点 ...

  7. 洛谷P1257 平面上的最接近点对

    n<=10000个点,求欧几里德距离最小的一对点. 经典分治,把这些点按x排序,分成两半,每边分别算答案,答案是左边的最小,右边的最小,左右组起来的最小三者的最小.发现只有左右组的有点难写. 假 ...

  8. p1429 平面最近点对(加强版)

    传送门 分析 我们可以枚举每一个点算它的最近点 估价函数应该分为3种情况计算: 大于max,小于min,位于min和max之间 代码 #include<iostream> #include ...

  9. Luogu P1429 平面最近点对 【分治】By cellur925

    题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定 ...

随机推荐

  1. sql-server安装

    ubuntu安装sql-server https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-ubuntu?view ...

  2. cf166e 在四面体上寻找路线数 递推,取模

    来源:codeforces                 E. Tetrahedron   You are given a tetrahedron. Let's mark its vertices ...

  3. scenario testing

    我们的APP“吃了么”是专为爱美食的人打造的,典型的用户自然是那些喜欢美食的“吃货”们,当然也可以为想要快速找到周边餐馆的童鞋提供便利.还有一种典型的用户就是喜欢自己烹调食物的人. 我们整理出来了下面 ...

  4. CSS编码规则

    /* 和HTML一样使用两个空格来代替制表符 */ div { /* 为了代码的易读性,在每个声明块的左花括号前添加一个空格 */' padding: 15px; /* 每个声明语句的:后应该插入一个 ...

  5. 关于HashMap和Hashtable的区别

    Hashtable的应用非常广泛,HashMap是新框架中用来代替Hashtable的类,也就是说建议使用HashMap,不要使用Hashtable.可能你觉得Hashtable很好用,为什么不用呢? ...

  6. Docker(二十七)-Docker 清理占用的磁盘空间

    1. docker system命令 docker system df命令,类似于Linux上的df命令,用于查看Docker的磁盘使用情况: docker system dfTYPE TOTAL A ...

  7. SQLserver 一种简单的GUI方式创建DBlink copy 表数据的方法

    1. 在sqlserver 上面使用GUI的方式创建dblink 首先打开查询分析器 在如下的位置处右键 -新建连接服务器 输入需要copy数据的服务器 输入ip地址 然后建立连接 在打开查询分析器进 ...

  8. python使用原始套接字 解析原始ip头数据

    使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100& ...

  9. [转]curl的详细使用

    转自:http://www.cnblogs.com/gbyukg/p/3326825.html 下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://www.centos ...

  10. python自动化运维笔记2 —— IP地址处理模块IPy

    1.2 实用的IP地址处理模块IPy ip地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能.可扩展性等方面,在这个过程当中,免不了要计算大量的IP地址,包括 ...