【BZOJ2716】天使玩偶【kd树】
这个题要求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树】的更多相关文章
- bzoj 2716 天使玩偶 —— K-D树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2716 果然和 bzoj 2648 是一样的吧: 只是数组要迷之开大,3e5+5 会RE? 代 ...
- [BZOJ2716]天使玩偶
[BZOJ2716]天使玩偶 题目大意: 一个平面直角坐标系,坐标\(1\le x,y\le10^6\).\(n(n\le10^6)\)次操作,操作包含以下两种: 新增一个点\((x,y)\): 询问 ...
- 【BZOJ-2648&2716】SJY摆棋子&天使玩偶 KD Tree
2648: SJY摆棋子 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 2459 Solved: 834[Submit][Status][Discu ...
- BZOJ.2716.[Violet3]天使玩偶(K-D Tree)
题目链接 KD-Tree.因为插入过多点后可能会退化成链,所以左/右子树sz > α*整棵子树sz时对整棵子树进行重构. 树的节点数必须是3n?why?洛谷,BZOJ都这样..(数据范围错了吧 ...
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- BZOJ2716天使玩偶
不会KD-tree怎么办?CQD硬搞. 建立正常的平面直角坐标系,首先我们只考虑在目标点左下角的点对目标点的贡献,由于左下点的横纵坐标都小于目标点,那么曼哈顿距离就可以化简了,绝对值去掉后,得到$x2 ...
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
随机推荐
- 使用file_get_contents提交http post
以前使用curl获取需要登陆内容的文章,但其实,自5.0开始,使用file_get_contents就可以完成.(前提是开启了allow_url_fopen),下面以一个简单的例子说明一下:1.先看一 ...
- keras_基本网络层结构(1)_常用层
参考文献: https://blog.csdn.net/sinat_26917383/article/details/72857454 http://keras-cn.readthedocs.io/e ...
- 从JDK源码角度看Short
概况 Java的Short类主要的作用就是对基本类型short进行封装,提供了一些处理short类型的方法,比如short到String类型的转换方法或String类型到short类型的转换方法,当然 ...
- Winform创建解决方案
Winform的开发工具可以使用VS2005---VS2013,版本在不断升级,VS的功能也越来越强大.本系列文章采用VS2012(以后全称VS)演示. 窗体是winform开发的基础,需要掌握窗体的 ...
- 把mac地址转换为标准mac地址
把"00:90:8A:1D:30:51"转换成"00-90-8A-1D-30-51",如何格式错误,显示出格式错误的种类,有些不规范的转换成规范的格式,例如,& ...
- 20155319 2016-2017-2 《Java程序设计》第六周学习总结
20155319 2016-2017-2 <Java程序设计>第六周学习总结 教材学习内容总结 ==第十章 输入/输出== 10.1 InputStream与OutputStream 10 ...
- 如何重启 Windows 10 子系统(WSL) ubuntu
如何重启 Windows 10 子系统(WSL) ubuntu WSL 子系统是基于 LxssManager 服务运行的. 只需要将 LxssManager 重启即可. 可以做成一个 bat 文件. ...
- LogHelp 日记分天记录,只记30天日记
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Tex ...
- thinkpad t420安装debian需要注意的细节
关闭双显卡,使用集成显卡,32位可以用独显跑起来,但是64位的wheezy只能兼容集成显卡,不知道为啥,否则会在某些usb插入/或者拔出来以后,重启提示 failed to execute /lib/ ...
- HDU 2846 Repository(字典树,每个子串建树,*s的使用)
Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...