这个题要求kd树支持两个操作。

1.插入一个新的点。

2.查询某个点最近曼哈顿距离。

注意查询曼哈顿距离和查询欧几里得距离,是有区别的。(估价函数不同)。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn=+;
const int INF=; struct kdNode{
int x[],mnn[],mxn[];
int div;
bool lef;
}p[maxn],q;
int n,m,cmpNo;
int lc[maxn],rc[maxn];
int cmp(kdNode a,kdNode b){
return a.x[cmpNo]<b.x[cmpNo];
}
void maintain(int o){
int ls=lc[o],rs=rc[o];
for(int i=;i<;i++){
p[o].mnn[i]=min(min(p[ls].mnn[i],p[rs].mnn[i]),p[o].x[i]);
p[o].mxn[i]=max(max(p[ls].mxn[i],p[rs].mxn[i]),p[o].x[i]);
}
} void build(int&o,int l,int r,int d){
if(l>r){
o=;
return;
}
int m=l+(r-l)/;
cmpNo=d;
nth_element(p+l,p+m,p+r+,cmp);
o=m;
p[m].div=d;
if(l==r){//好像可以不写
p[m].lef=;
p[m].mnn[]=p[m].mxn[]=p[m].x[];
p[m].mnn[]=p[m].mxn[]=p[m].x[];
return;
}
build(lc[o],l,m-,d^);
build(rc[o],m+,r,d^);
maintain(o);
}
int cal(int o){
int res=;
for(int i=;i<;i++)
res+=max(,p[o].mnn[i]-q.x[i]);
for(int i=;i<;i++)
res+=max(,q.x[i]-p[o].mxn[i]);
}
void Insert(int& o,int d){
if(!o){
o=++n;
p[n]=q;
p[n].div=d;
p[n].lef=;
// p[n].mnn[0]=p[n].mxn[0]=p[n].x[0];
// p[n].mnn[1]=p[n].mxn[1]=p[n].x[1];
return maintain(o);
//return;
}
int t=q.x[d]-p[o].x[d];
if(t>=){
Insert(rc[o],d^);
}else{
Insert(lc[o],d^);
}
maintain(o);
}
int ans;
void query(int o,int d){
if(!o)return;
ans=min(ans,abs(p[o].x[]-q.x[])+abs(p[o].x[]-q.x[]));
int d1=cal(lc[o]),d2=cal(rc[o]);
if(d2<d1){
query(rc[o],d^);
if(ans>d1)
query(lc[o],d^);
}else{
query(lc[o],d^);
if(ans>d2)
query(rc[o],d^);
}
} int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d%d",&p[i].x[],&p[i].x[]);
}
int root;
p[].mnn[]=p[].mnn[]=INF;
p[].mxn[]=p[].mxn[]=-INF;
build(root,,n,);
for(int i=;i<=m;i++){
int opt;
scanf("%d",&opt);
if(opt==){
scanf("%d%d",&q.x[],&q.x[]);
Insert(root,);
}else{
scanf("%d%d",&q.x[],&q.x[]);
ans=INF;
query(root,);
printf("%d\n",ans);
}
}
return ;
}

【BZOJ2716】天使玩偶【kd树】的更多相关文章

  1. bzoj 2716 天使玩偶 —— K-D树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 果然和 bzoj 2648 是一样的吧: 只是数组要迷之开大,3e5+5 会RE? 代 ...

  2. [BZOJ2716]天使玩偶

    [BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...

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

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

  4. BZOJ.2716.[Violet3]天使玩偶(K-D Tree)

    题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...

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

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

  6. BZOJ2716天使玩偶

    不会KD-tree怎么办?CQD硬搞. 建立正常的平面直角坐标系,首先我们只考虑在目标点左下角的点对目标点的贡献,由于左下点的横纵坐标都小于目标点,那么曼哈顿距离就可以化简了,绝对值去掉后,得到$x2 ...

  7. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  8. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  9. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

随机推荐

  1. [转载]java中的标号:outer的作用

    转载自:http://blog.sina.com.cn/s/blog_6f8bd746010136yr.html 标号label 标号提供了一种简单的break语句所不能实现的控制循环的方法,当在循环 ...

  2. 征信接口调用,解析(xml)

    数据传输格式报文格式:xml public CisReportRoot queryCisReport(PyQueryBean pyQueryBean) throws Exception { CisRe ...

  3. 转:HTTP Get请求URL最大长度

    转自:http://blog.csdn.net/M_ChangGong/article/details/5764711 各浏览器HTTP Get请求URL最大长度并不相同,几类常用浏览器最大长度及超过 ...

  4. MySQL 存储过程理解

    /********************************************************************************* * MySQL 存储过程理解 * ...

  5. [QT]问题记录-QPixmap::scaled 缩放不成功

    解答的帖子: http://bbs.csdn.net/topics/391850818 使用 pix.scaled(400,400)  之后需要将图片返回就可以了.

  6. rabbitmq学习(三):rabbitmq之扇形交换机、主题交换机

    前言 上篇我们学习了rabbitmq的作用以及直连交换机的代码实现,这篇我们继续看如何用代码实现扇形交换机和主题交换机 一.扇形交换机 1.生产者 /** * 生产者 */ public class ...

  7. 转HTTP协议 --- Cookie

    转自:http://www.cnblogs.com/TankXiao/archive/2013/04/15/2848906.html Cookie是HTTP协议中非常重要的东西, 之前拜读了Fish ...

  8. SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

    FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...

  9. 【转】MySQL存储过程中使用动态行转列

    MySQL存储过程中使用动态行转列 最近做项目关于数据报表处理,然而数据库存储格式和报表展现形式不同,需要进行一下行转列的操作,在做上一个项目的时候也看了一下,但是后来换了读取方式,也就没深入研究这个 ...

  10. 建立SSH隧道从外网访问内网服务器

    http://blog.trackets.com/2014/05/17/ssh-tunnel-local-and-remote-port-forwarding-explained-with-examp ...