这个题要求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. L202

    Yuan Cao’s teenage years were hardly typical. By age 18, he had already graduated from high school, ...

  2. MDI窗体及涉及到的相关问题

    MDI窗体是个什么东东尼?多文档窗体唠,相对的还有个SDI,就是单文档窗体.一般情况下我们会将软件的主窗体设置为MDI窗体.那么在主窗体的菜单部分调出来的其他窗体就是主窗体的子窗体了. (1)在主窗体 ...

  3. Linux升级nodejs及多版本管理

    最近要用到开发要用到nodejs,于是跑到开发机运行了下node,已经安装了,深感欣慰,是啥版本呢?再次运行了下node -v,原来是0.6.x的.估计是早先什么时候谁弄的.那么来升级下node吧. ...

  4. BZOJ3270: 博物馆【概率DP】【高斯消元】

    Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博物馆.这座博物馆有着特别的样式.它包含由m条走廊连接的n间房间,并且满足可以从任何一 ...

  5. 《DSP using MATLAB》示例 Example 9.11

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  6. 优先队列底层实现是堆(heap)(操作系统进程调度)

    只有一个CPU的情况下,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行(删除),并且也可以添加一个新的作业到作业的优先队列中(插入). 插入操作 ...

  7. phpstorm搜索匹配正则表达式

    data-position=".................................................................." 点是匹配任意一 ...

  8. bzoj 3328 PYXFIB——单位根反演

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3328 单位根反演主要就是有 \( [k|n] = \frac{1}{k}\sum\limit ...

  9. Web验证方式(4)--JWT

    OAuth协议中说到的AccessToken可以是以下两种: 1.任意只起到标识作用的字符串:这种情况下Resource Server处理请求时需要去找Authorization Server获取用户 ...

  10. 机器学习The Learning Problem——coursera简要总结

    1.人类及动物的学习模式:观察->学习->技能 机器学习的模式:data->ML(机器学习)->skill 2.那什么是skill:技能是某种表现方法的增进   eg:stac ...