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]天使玩偶的更多相关文章

  1. BZOJ2648/2716:SJY摆棋子/[Violet]天使玩偶(K-D Tree)

    Description 这天,SJY显得无聊.在家自己玩.在一个棋盘上,有N个黑色棋子.他每次要么放到棋盘上一个黑色棋子,要么放上一个白色棋子,如果是白色棋子,他会找出距离这个白色棋子最近的黑色棋子. ...

  2. bzoj2716/2648 / P4169 [Violet]天使玩偶/SJY摆棋子

    P4169 [Violet]天使玩偶/SJY摆棋子 k-d tree 模板 找了好几天才发现输出优化错了....真是zz...... 当子树非常不平衡时,就用替罪羊树的思想,拍扁重建. luogu有个 ...

  3. bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree

    2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec  Memory Limit: 128 MB Description 这天,S ...

  4. 【LG4169】[Violet]天使玩偶/SJY摆棋子

    [LG4169][Violet]天使玩偶/SJY摆棋子 题面 洛谷 题解 至于\(cdq\)分治的解法,以前写过 \(kdTree\)的解法好像还\(sb\)一些 就是记一下子树的横.纵坐标最值然后求 ...

  5. 洛谷 P4169 [Violet]天使玩偶/SJY摆棋子 解题报告

    P4169 [Violet]天使玩偶/SJY摆棋子 题目描述 \(Ayu\)在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,\(Ayu\) 却忘了她把天使玩偶埋在了哪 ...

  6. BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶

    BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...

  7. luoguP4169 [Violet]天使玩偶/SJY摆棋子 K-Dtree

    P4169 [Violet]天使玩偶/SJY摆棋子 链接 luogu 思路 luogu以前用CDQ一直过不去. bzoj还是卡时过去的. 今天终于用k-dtree给过了. 代码 #include &l ...

  8. 洛谷P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治)

    [Violet]天使玩偶/SJY摆棋子 题目传送门 解题思路 用CDQ分治开了氧气跑过. 将输入给的顺序作为第一维的时间,x为第二维,y为第三维.对于距离一个询问(ax,ay),将询问分为四块,左上, ...

  9. [Violet]天使玩偶/SJY摆棋子 [cdq分治]

    P4169 [Violet]天使玩偶/SJY摆棋子 求离 \((x,y)\) 最近点的距离 距离的定义是 \(|x1-x2|+|y1-y2|\) 直接cdq 4次 考虑左上右上左下右下就可以了-略微卡 ...

随机推荐

  1. spring Boot使用AOP统一处理Web请求日志记录

    1.使用spring boot实现一个拦截器 1.引入依赖: <dependency>   <groupId>org.springframework.boot</grou ...

  2. Bootstrap-CSS:概况

    ylbtech-Bootstrap-CSS:概况 1.返回顶部 1. Bootstrap CSS 概览 在这一章中,我们将讲解 Bootstrap 底层结构的关键部分,包括我们让 web 开发变得更好 ...

  3. [转]批处理遍历文件夹生成 html 文件

    [转自] http://www.360doc.com/content/15/0205/20/21861372_446525665.shtml :: 自动将指定文件夹中的图片写入到 html 文件中 @ ...

  4. linux Composer 安装

    Composer是一个管理PHP包依赖关系的工具.我们可以使用Composer方便地管理项目中一些第三方库和自己的库. 我们可以把Composer安装到当前目录或者特定目录甚至将它变成全局命令 *执行 ...

  5. JDK1.5多线程提高

    1.名词: 1.任务的执行与任务的提交解耦 2.任务的执行策略-可中断,取消 2.线程封闭机制: 针对单线程池而言,提高任务执行的速度,但是无需锁定 3.饥饿死锁: 任务长期得不到执行,其实就是形成闭 ...

  6. 一起KVM环境下windows7虚拟机异常死机(BSOD)的问题解决

    先说一下环境: 一.硬件 8台服务器做的超融合架构,软件存储池, 每台服务器是96G内存,两颗Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz,32线程. 每台服务器是 ...

  7. lambda,sorted(),filter(),map(),递归,二分法

    1. lambda 匿名函数 语法: lambda 参数:返回值 不能完成复杂的操作例 # li=['21','asdd','weqeqw','wqf']# # it=iter(li)# # prin ...

  8. mysql更新(八) 可视化工具Navicat的使用 索引

    17-索引   一.索引的介绍 数据库中专门用于帮助用户快速查找数据的一种数据结构.类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置吗,然后直接获取. 二 .索引的作用 约束和加速查 ...

  9. etcd查看key-value

    get/set key-value etcdctl get/set /key-path etcdctl watch --recursive /test/sm/default/apps 查看所有key- ...

  10. 不常用的容易忘记常见mysql操作数据表命令

    删除外键关联的约束 alter table tablename drop  foreign key keyname;