核心思想:

将空间内的点进行合理划分,以支持有关高维点的操作。

其实就是将线段树搬到了二维及更高维度上。

注意$KD-tree$虽然很像线段树,但其实是一棵二叉搜索树,空间复杂度是$O(n)$的。

查询时本质是一个搜索+剪枝,时间复杂度最优$O(logn)$,期望$O(\sqrt{n})$。

没了。

代码([CQOI2016]K远点对):

#include<bits/stdc++.h>
#define maxn 100005
#define maxm 500005
#define inf 1ll<<62
#define ll long long
#define debug(x) cerr<<#x<<": "<<x<<endl
#define fgx cerr<<"--------------"<<endl
#define dgx cerr<<"=============="<<endl using namespace std;
struct node{int x[];}p[maxn];
int n,K,np,tot,ls[maxn],rs[maxn];
int id[maxn],mx[maxn][],mn[maxn][];
priority_queue<ll,vector<ll>,greater<ll> > q; inline int read(){
int x=,f=; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-;
for(;isdigit(c);c=getchar()) x=x*+c-'';
return x*f;
} inline ll dis(ll xa,ll ya,ll xb,ll yb){return (xa-xb)*(xa-xb)+(ya-yb)*(ya-yb);}
inline bool cmp(node a,node b){
if(!np) return (a.x[]==b.x[])?(a.x[]<b.x[]):(a.x[]<b.x[]);
else return (a.x[]==b.x[])?(a.x[]==b.x[]):(a.x[]<b.x[]);
} inline ll getdis(node po,int k){
ll res=;
for(int i=;i<;i++){
ll a=abs(po.x[i]-mx[k][i]),b=abs(po.x[i]-mn[k][i]);
res+=max(a*a,b*b);
}
return res;
}
inline void pushup(int k){
for(int i=;i<;i++){
mn[k][i]=mx[k][i]=p[id[k]].x[i];
if(ls[k]) mn[k][i]=min(mn[k][i],mn[ls[k]][i]),mx[k][i]=max(mx[k][i],mx[ls[k]][i]);
if(rs[k]) mn[k][i]=min(mn[k][i],mn[rs[k]][i]),mx[k][i]=max(mx[k][i],mx[rs[k]][i]);
}
}
inline int build(int l,int r,int op){
if(l>r) return ;
int mid=l+r>>,k=++tot; np=op,id[k]=mid;
nth_element(p+l,p+mid,p++r,cmp);
ls[k]=build(l,mid-,op^);
rs[k]=build(mid+,r,op^);
pushup(k); return k;
}
inline void query(node po,int k){
ll d=dis(po.x[],po.x[],p[id[k]].x[],p[id[k]].x[]);
if(d>q.top()) q.pop(),q.push(d);
ll dl=-inf,dr=-inf;
if(ls[k]) dl=getdis(po,ls[k]);
if(rs[k]) dr=getdis(po,rs[k]);
if(dl>dr){
if(dl>q.top()) query(po,ls[k]);
if(dr>q.top()) query(po,rs[k]);
}
else{
if(dr>q.top()) query(po,rs[k]);
if(dl>q.top()) query(po,ls[k]);
}
return;
} int main(){
n=read(),K=read();
for(int i=;i<=n;i++) p[i].x[]=read(),p[i].x[]=read();
build(,n,);
for(int i=;i<=*K;i++) q.push();
for(int i=;i<=n;i++) query(p[i],);
printf("%lld\n",q.top());
return ;
}

[CQOI2016]K远点对

【模板】KD-tree的更多相关文章

  1. [模板] K-D Tree

    K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...

  2. k-d tree模板练习

    1. [BZOJ]1941: [Sdoi2010]Hide and Seek 题目大意:给出n个二维平面上的点,一个点的权值是它到其他点的最长距离减最短距离,距离为曼哈顿距离,求最小权值.(n< ...

  3. AOJ DSL_2_C Range Search (kD Tree)

    Range Search (kD Tree) The range search problem consists of a set of attributed records S to determi ...

  4. 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2459  Solved: 834[Submit][Status][Discu ...

  5. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  6. k-d tree 学习笔记

    以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...

  7. K-D Tree

    这篇随笔是对Wikipedia上k-d tree词条的摘录, 我认为解释得相当生动详细, 是一篇不可多得的好文. Overview A \(k\)-d tree (short for \(k\)-di ...

  8. K-D Tree题目泛做(CXJ第二轮)

    题目1: BZOJ 2716 题目大意:给出N个二维平面上的点,M个操作,分为插入一个新点和询问到一个点最近点的Manhatan距离是多少. 算法讨论: K-D Tree 裸题,有插入操作. #inc ...

  9. k-d Tree in TripAdvisor

    Today, TripAdvisor held a tech talk in Columbia University. The topic is about k-d Tree implemented ...

  10. k-d tree算法

    k-d树(k-dimensional树的简称),是一种分割k维数据空间的数据结构.主要应用于多维空间关键数据的搜索(如:范围搜索和最近邻搜索). 应用背景 SIFT算法中做特征点匹配的时候就会利用到k ...

随机推荐

  1. 虚拟机中安装Kali遇到的问题及解决方法

    title: 虚拟机中安装Kali遇到的问题及解决方法 date: 2018-11-25 12:25:43 tags: 安全 --- 关于Kali版本选择 kail官方下载页面 虚拟机中当然就下载虚拟 ...

  2. i春秋四周年中奖名单出炉丨确认过眼神,你是中奖人

    i春秋四周年任性狂欢倒计时最后2天! 优享会员.精品课程.CTF经典赛题实战班.Web安全线上提高班.渗透测试工程师线下就业班.CISAW-Web安全认证......全部史上最低折扣,还有8888元现 ...

  3. MES系统如何帮助烟草行业管理生产流程

    与很多其他行业一样,烟草MES系统可以帮助卷烟企业实现智能生产.精益制造.快速实现烟草企业数字化车间的创建,助力企业实现改造升级,从而提升企业生产效率,降低生产成产.烟草行业得MES者得天下. 烟草行 ...

  4. LearnOpenGL.PBR.光照

    光源辐射率:      辐射率(radiance)表示光源在给定立体角ω下的辐射通量(或光源发射的能量).     那么假设立体角ω无限小时,辐射率就表示单束光线(或说某个单一方向)的辐射通量. 点光 ...

  5. 201871010121 王方 《面向对象程序设计(JAVA)》第七周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  6. 201871010132--张潇潇--《面向对象程序设计(Java)》第十一周学习总结

    博文正文开头格式:(2分) 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.co ...

  7. 201871010136-赵艳强《面向对象程序设计(java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...

  8. Docker镜像(六)

    一.镜像是什么 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 1. UnionFS( ...

  9. 洛谷 P1823 [COI2007] Patrik 音乐会的等待

    洛谷 P1823 [COI2007] Patrik 音乐会的等待 洛谷传送门 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A ...

  10. 洛谷 P1182 数列分段 Section II

    洛谷 P1182 数列分段 Section II 洛谷传送门 题目描述 对于给定的一个长度为N的正整数数列A-iA−i,现要将其分成M(M≤N)M(M≤N)段,并要求每段连续,且每段和的最大值最小. ...