SJY摆棋子&&[Violet 3]天使玩偶
SJY摆棋子
https://www.lydsy.com/JudgeOnline/problem.php?id=2648
[Violet 3]天使玩偶
https://www.lydsy.com/JudgeOnline/problem.php?id=2716
参考博客:https://blog.csdn.net/Littlewhite520/article/details/78284697
KDtree模板题,带插入
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstdio>
#include<cmath>
#define MAXN 1000005
#define INF 0x3f3f3f3f
using namespace std; int id;
int L,R,ans,root;
int n,m;
struct sair{
int Max[],Min[],p[],l,r;
bool operator<(const sair &b)const{
if(p[id]==b.p[id]) return p[id^]<b.p[id^];
return p[id]<b.p[id];
}
}tree[MAXN]; int dist(int now){
int dis=;;
if(L<tree[now].Min[]) dis+=tree[now].Min[]-L;
if(L>tree[now].Max[]) dis+=L-tree[now].Max[];
if(R<tree[now].Min[]) dis+=tree[now].Min[]-R;
if(R>tree[now].Max[]) dis+=R-tree[now].Max[];
return dis;
} void pushup(int now){
if(tree[now].l){
if(tree[tree[now].l].Max[]>tree[now].Max[]) tree[now].Max[]=tree[tree[now].l].Max[];
if(tree[tree[now].l].Min[]<tree[now].Min[]) tree[now].Min[]=tree[tree[now].l].Min[];
if(tree[tree[now].l].Max[]>tree[now].Max[]) tree[now].Max[]=tree[tree[now].l].Max[];
if(tree[tree[now].l].Min[]<tree[now].Min[]) tree[now].Min[]=tree[tree[now].l].Min[];
}
if(tree[now].r){
if(tree[tree[now].r].Max[]>tree[now].Max[]) tree[now].Max[]=tree[tree[now].r].Max[];
if(tree[tree[now].r].Min[]<tree[now].Min[]) tree[now].Min[]=tree[tree[now].r].Min[];
if(tree[tree[now].r].Max[]>tree[now].Max[]) tree[now].Max[]=tree[tree[now].r].Max[];
if(tree[tree[now].r].Min[]<tree[now].Min[]) tree[now].Min[]=tree[tree[now].r].Min[];
}
} int build(int l,int r,int D){
int mid=(l+r)>>;
id=D;
nth_element(tree+l,tree+mid,tree+r+);
if(l!=mid) tree[mid].l=build(l,mid-,D^);
if(r!=mid) tree[mid].r=build(mid+,r,D^);
tree[mid].Max[]=tree[mid].Min[]=tree[mid].p[];
tree[mid].Max[]=tree[mid].Min[]=tree[mid].p[];
pushup(mid);
return mid;
} void Insert(int rt){
int now=root,D=;//now从头开始往下查询
while(){
///比较新加进来的点,更新最大最小值
if(tree[rt].Max[]>tree[now].Max[]) tree[now].Max[]=tree[rt].Max[];
if(tree[rt].Max[]>tree[now].Max[]) tree[now].Max[]=tree[rt].Max[];
if(tree[rt].Min[]<tree[now].Min[]) tree[now].Min[]=tree[rt].Min[];
if(tree[rt].Min[]<tree[now].Min[]) tree[now].Min[]=tree[rt].Min[]; if(tree[rt].p[D]>=tree[now].p[D]){
if(!tree[now].r){
tree[now].r=rt;
return;
}
now=tree[now].r;
}
else{
if(!tree[now].l){
tree[now].l=rt;
return;
}
now=tree[now].l;
}
D^=;
}
} void query(int now){
int dl,dr,dis;
dis=abs(tree[now].p[]-L)+abs(tree[now].p[]-R);
if(dis<ans) ans=dis;
if(tree[now].l) dl=dist(tree[now].l);
else dl=INF;
if(tree[now].r) dr=dist(tree[now].r);
else dr=INF;
if(dl<dr){
if(dl<ans) query(tree[now].l);
if(dr<ans) query(tree[now].r);
}
else{
if(dr<ans) query(tree[now].r);
if(dl<ans) query(tree[now].l);
}
} int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d %d",&tree[i].p[],&tree[i].p[]);
}
root=build(,n,);
int x,y,z;
for(int i=;i<=m;i++){
scanf("%d %d %d",&x,&y,&z);
if(x==){
n++;
tree[n].Max[]=tree[n].Min[]=tree[n].p[]=y;
tree[n].Max[]=tree[n].Min[]=tree[n].p[]=z;
Insert(n);
}
else{
ans=INF;
L=y,R=z;
query(root);
printf("%d\n",ans);
}
}
}
/*
2 3
1 1
2 3
2 1 2
1 3 3
2 4 2
*/
SJY摆棋子&&[Violet 3]天使玩偶的更多相关文章
- BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)
Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...
- bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子
P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- 【LG4169】[Violet]天使玩偶/SJY摆棋子
[LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...
- 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告
P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree
P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...
- 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)
[Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...
- [Violet]天使玩偶/SJY摆棋子 [cdq分治]
P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...
随机推荐
- CefSharp v62修改,支持.net4.0
吐槽一下,博客园久了没有上,账号没了,重新申请一个. cesharp v62版本,内核采用最新的Cef 62,支持最新的Grid布局. 由于官方的cefsharp 采用.net4.5.2开发.怎么办怎 ...
- Shell的for和select
环境准备: [root@nodchen-db01-test day07]# mkdir -p /server/scripts/day07/test/{test.txt,oldboy.txt,oldgi ...
- [UE4]C++ getter and setter
问:以前面向对象没学好.... 最近老是在想,既然要设为private为什么还要写个setter来改变它的值呢? 为什么不直接把它直接设成public倒省事? 呵呵,谢啦 答:用setter来改变数据 ...
- https的加密解密是怎么写的?
原文转载至:http://blog.csdn.net/aqiangsz/article/details/53611665 文章中有些不对的地方,比如用证书对改随机码进行加密,这个是不对,证书本身并没有 ...
- Unreal Engine 4 反射机制的实现
转自:http://blog.csdn.net/noahzuo/article/details/51482255 反射机制 反射机制指的是程序可以在运行期间进行检测和修改自己状态的能力. UE4引擎使 ...
- 学习MongoDB 三: MongoDB无法启动的解决方法
一简介 我们之前介绍了MongoDB入门(安装与配置),我们今天在打开MongDB时,我们先运行cmd.exe进入dos命令界面,然后进入cd D:\mongodb\bin目录下,启动服务或者mon ...
- Linux编辑器|gedit|vi|vim编辑器
gedit编辑器 gedit是一个Linux环境下的文本编辑器,类似windows下的写字板程序,在不需要特别复杂的编程环境下,作为基本的文本编辑器比较合适. sublime编辑器 Sublime T ...
- git超详细教程留着当手册
GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化Git仓库 :git init ; -- 提交改变到缓存 :gi ...
- JAVA Spring JdbcTemplate ( 以 SQLSERVER 为例 ) 的简单使用
< 1 > 配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=&q ...
- Java工具类实现校验公民身份证的有效性
转自:https://www.oschina.net/code/snippet_1859292_39120 1 package com.tg.user.controller; import java. ...