【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 却忘了她把天使玩偶埋在了哪里, ...
随机推荐
- 记录JAVAWEB部署到JBOSS中遇到的问题
服务器环境 jdk1.8.0_212 + jboss-eap-6.4 系统是 Service 2008 R2 数据服务器 oracle12c 系统是 Service 2008 R2 首先安装的or ...
- redis-cluster集群安装(基于redis-3.2.10)
上节主要演示了redis单节点的安装部署,对于数据量更大的服务可以安装redis-cluster进行处理 1. 安装ruby yum install ruby ruby-devel rubygems ...
- Map排序(按key排序,按value排序)
主要分两种,按键排序.按值排序. 而且,按key排序主要用于TreeMap,而按value排序则对于Map的子类们都适用. 一.按键排序 按Key排序主要用于TreeMap,可以实现按照Key值的大小 ...
- Cockpit 容器&&kubernetes 管理可视化工具
安装 在k8s 的master 上 yum install -y cockpit cockpit-ws cockpit-kubernetes cockpit-bridge cockpit-dashbo ...
- DB2经常使用命令
1.打开命令行窗体 #db2cmd 2.打开控制中心 # db2cmd db2cc 3.打开命令编辑器 db2cmd db2ce =====操作数据库命令===== 4.启动数据库实例 #db2s ...
- fb远程连接服务器调试,碉堡了
开发中经常碰到本地代码没问题,上传到服务器上就有有问题, 这个时候调试变的很麻烦,放个textField自己保存日志这种方式调试的都是. 今天刚学了远程连接服务器,adobe真是牛逼坏了啊. 新增一个 ...
- Ant build.xml相关属性详解
关键字: ant build.xml Ant的概念 可能有些读者并不连接什么是Ant以及入可使用它,但只要使用通过Linux系统得读者,应该知道make这个命令.当编译Linux内核及一些软件的源程序 ...
- URL 收录
http://www.cnblogs.com/Olive116/p/3426957.html 地图控件 http://www.cnblogs.com/tugenhua0707/ 前端
- java.nio.charset.UnsupportedCharsetException: cp0
使用jython调用python,提示console: Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0. ...
- [转][C#]压缩解压缩类 GZipStream
本文来自:https://msdn.microsoft.com/zh-cn/library/system.io.compression.gzipstream(v=vs.100).aspx using ...