【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 却忘了她把天使玩偶埋在了哪里, ...
随机推荐
- 今天廷鹏师弟来的java建议
如下一段获取数据代码的问题: public Serializable getById(Serializable id) throws BaseBusinessException { if (id = ...
- Mac下忘记mysql的root密码
cd /usr/local/mysql/bin sudo su sudo /usr/local/mysql/support-files/mysql.server stop # ./mysqld_saf ...
- 【python】Beautiful Soup的使用
1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.pyt ...
- 解决移动端H5海报滑动插件适应大部分手机问题 手机端高度自适应
Html5微信端滑屏海报在各种尺寸的手机上总会有这样那样的问题,经过多次制作总结出来一些小心得,分享下. 我使用的是jquery插件swiper.min.js,动画可以利用animate.css,如果 ...
- jsp---猜数字游戏,深有感触
猜数字游戏注意两点.1.随机数和猜的数字不能放在同一个页面,不然随机数不停出现,猜的数字不可能相等的. 2.数据类型的相互转换.包装类Integer和int的用法,前者是类,后者是基本数据类型 cai ...
- Java toString()方法的神奇之处
Java 手册 toString(String类中) public String toString() 返回此对象本身(它已经是一个字符串!). 指定者: 接口 CharSequence 中的 toS ...
- Bootstrap-Plugin:弹出框(Popover)插件
ylbtech-Bootstrap-Plugin:弹出框(Popover)插件 1.返回顶部 1. Bootstrap 弹出框(Popover)插件 弹出框(Popover)与工具提示(Tooltip ...
- java之Jsch实现Linux的文件上传与下载
一.JSch是Java Secure Channel的缩写.JSch是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功 ...
- MTU&MSS
MTU是Maximum Transmission Unit的缩写,意为最大传输单元,通俗的理解就是在网络上传送的最大数据包,单位是字节. 以太网对数据帧的长度都有一个限制,其最大值为1500,这个特性 ...
- 给iOS开发新手送点福利,简述UISegment的属性和用法
UISegment属性 1.segmentedControlStyle 设置segment的显示样式. typedef NS_ENUM(NSInteger, UISegmentedControlSty ...