浅谈\(K-D\) \(Tree\):https://www.cnblogs.com/AKMer/p/10387266.html

题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2648

\(K-D\) \(Tree\)最近点查询裸题,注意先把所有点建好再一个个激活。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; const int maxn=5e5+5,inf=2e9; int n,m,pps,ans,node[maxn]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} struct query {
int opt,x,y;
}q[maxn]; struct kd_tree {
int cnt,root;
int fa[maxn<<1]; struct point {
int c[2],mn[2],mx[2],id,ls,rs; point() {} point(int _x,int _y,int _id) {
c[0]=_x,c[1]=_y,id=_id;
if(id<=n)mn[0]=mx[0]=c[0],mn[1]=mx[1]=c[1];
else mn[0]=mn[1]=inf,mx[0]=mx[1]=-inf;
ls=rs=0;
} bool operator<(const point &a)const {
return c[pps]<a.c[pps];
}
}p[maxn<<1]; void update(int u) {
int ls=p[u].ls,rs=p[u].rs;
for(int i=0;i<2;i++) {
int mn=min(p[ls].mn[i],p[rs].mn[i]);
p[u].mn[i]=min(p[u].mn[i],mn);
int mx=max(p[ls].mx[i],p[rs].mx[i]);
p[u].mx[i]=max(p[u].mx[i],mx);
}
} int build(int l,int r,int cmp) {
int mid=(l+r)>>1,u=mid;pps=cmp;
nth_element(p+l,p+mid,p+r+1);
if(p[u].id>n)node[p[u].id-n]=u;
if(l<mid)fa[p[u].ls=build(l,mid-1,cmp^1)]=u;
if(r>mid)fa[p[u].rs=build(mid+1,r,cmp^1)]=u;
update(u);
return u;
} void prepare() {
p[0]=point(0,0,2e9);
for(int i=1;i<=n;i++) {
int x=read(),y=read();
p[i]=point(x,y,i);
}
for(int i=1;i<=m;i++) {
int opt=read(),x=read(),y=read();
q[i].opt=opt,q[i].x=x,q[i].y=y;
if(opt==1)p[++cnt]=point(x,y,n+i);
}
root=build(1,cnt,0);
} void arouse(int u) {
p[u].mn[0]=p[u].mx[0]=p[u].c[0];
p[u].mn[1]=p[u].mx[1]=p[u].c[1];
while(fa[u])update(u),u=fa[u];
update(u);
} int dis(int id,int x,int y) {
int res=0;
if(x<p[id].mn[0])res+=p[id].mn[0]-x;
if(x>p[id].mx[0])res+=x-p[id].mx[0];
if(y<p[id].mn[1])res+=p[id].mn[1]-y;
if(y>p[id].mx[1])res+=y-p[id].mx[1];
return res;
} void query(int u,int x,int y,int id) {
if(p[u].id<id)ans=min(ans,abs(x-p[u].c[0])+abs(y-p[u].c[1]));
int dl=p[u].ls?dis(p[u].ls,x,y):inf;
int dr=p[u].rs?dis(p[u].rs,x,y):inf;
if(dl<dr) {
if(dl<ans)query(p[u].ls,x,y,id);
if(dr<ans)query(p[u].rs,x,y,id);
}
else {
if(dr<ans)query(p[u].rs,x,y,id);
if(dl<ans)query(p[u].ls,x,y,id);
}
}
}T; int main() {
T.cnt=n=read(),m=read();
T.prepare();
for(int i=1;i<=m;i++)
if(q[i].opt==1)T.arouse(node[i]);
else {
ans=2e9;
T.query(T.root,q[i].x,q[i].y,n+i);
printf("%d\n",ans);
}
return 0;
}

BZOJ2648:SJY摆棋子的更多相关文章

  1. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  2. [BZOJ2648] SJY摆棋子 kd-tree

    2648: SJY摆棋子 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 5421  Solved: 1910[Submit][Status][Disc ...

  3. Bzoj2648 SJY摆棋子

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 3128  Solved: 1067 Description 这天,SJY显得无聊.在家自己玩.在一个 ...

  4. BZOJ2648 SJY摆棋子(KD-Tree)

    板子题. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...

  5. 【kd-tree】bzoj2648 SJY摆棋子

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  6. 2019.01.14 bzoj2648: SJY摆棋子(kd-tree)

    传送门 kd−treekd-treekd−tree模板题. 题意简述:支持在平面上插入一个点,求对于一个点的最近点对. 思路:cdqcdqcdq是一种很不错的分治方法 只是好像码量有点窒息 所以我用了 ...

  7. KDTree(Bzoj2648: SJY摆棋子)

    题面 传送门 KDTree 大概就是一个分割\(k\)维空间的数据结构,二叉树 建立:每层选取一维为关键字,把中间的点拿出来,递归左右,有个\(STL\)函数nth_element可以用一下 维护:维 ...

  8. [bzoj2648]SJY摆棋子(带插入kd-tree)

    解题关键:带插入kdtree模板题. #include<iostream> #include<cstdio> #include<cstring> #include& ...

  9. luogu4169 [Violet]天使玩偶/SJY摆棋子 / bzoj2648 SJY摆棋子 k-d tree

    k-d tree + 重构的思想,就能卡过luogu和bzoj啦orz #include <algorithm> #include <iostream> #include &l ...

  10. 【BZOJ2648】SJY摆棋子(KD-Tree)

    [BZOJ2648]SJY摆棋子(KD-Tree) 题面 BZOJ Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一 ...

随机推荐

  1. 快乐学习 Ionic Framework+PhoneGap 手册1-1{创建APP项目}

    快乐学习 Ionic Framework+PhoneGap 手册1-1 * 前提必须安装 Node.js,安装PhoneGap,搭建Android开发环境,建议使用真机调试 {1.1}= 创建APP项 ...

  2. 写时拷贝(Copy On Write)方案详解

    本文旨在通过对 写时拷贝 的四个方案(Copy On Write)分析,让大家明白写时拷贝的实现及原理. 关于浅拷贝与深拷贝,我在之前的博客中已经阐述过了  浅拷贝容易出现指针悬挂的问题,深拷贝效率低 ...

  3. 20165101刘天野 2017-2018-2 《Java程序设计》第6周学习总结

    #20165101刘天野 2017-2018-2 <Java程序设计>第6周学习总结 教材学习内容总结 第八章:常用实用类 String类:不可变类,一些看起来能够改变String的方法其 ...

  4. 第二节课-Data-driven approach:KNN和线性分类器分类图片

    2017-08-12 1.图片分类是很多CV任务的基础: 2.图片分类要面临很多的问题,比如图片被遮挡,同一种动物有很多种颜色,形状等等,算法需要足够强壮: 3.所以很难直接写出程序来进行图片分类,常 ...

  5. dfs枚举

    深度优先搜索(DFS,Depth-First Search)是搜索手段之一.它从某个状态开始,不断的转移状态知道无法转移,然后退回到前一步的状态,继续转移到其他状态,如此不断重复,直到找到最终的解. ...

  6. Apache与Tomcat三种连接方式JK、http_proxy、ajp_proxy

    为什么要让Apache与Tomcat之间进行连接?事实上Tomcat本身已经提供了HTTP服务,该服务默认的端口是8080,也可以改为80.既然Tomcat本身已经可以提供动态加静态web服务,为什么 ...

  7. Elasticsearch6.0简介入门介绍

    Elasticsearch简单介绍 Elasticsearch (ES)是一个基于Lucene构建的开源.分布式.RESTful 接口全文搜索引擎.Elasticsearch 还是一个分布式文档数据库 ...

  8. 【bzoj5085】最大(二分+乱搞)

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5085 这道题我们可以先二分答案,然后转化为判定是否有四角权值>=mid的矩形. ...

  9. springboot 配置过滤器

    能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...

  10. 轻松掌握XMLHttpRequest对象------【这是.net 版本】

    轻松掌握XMLHttpRequest对象 XmlHttp是什么? 最通用的定义为:XmlHttp是一套可以在Javascript.VbScript.Jscript等脚本语言中通过http协议传送或从接 ...