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. 学习笔记之FluentAssertions

    dotnet/src/MoqSample at master · haotang923/dotnet · GitHub https://github.com/htanghtang/dotnet/tre ...

  2. [转][html][jquery]

    <!-- 强行修改 CSS --> $('a').css("cssText","background:#fff !important;color:#2d6dc ...

  3. [.net]webform 版本冲突

    ASP.NET Web Pages版本问题 调试后浏览器提示: 检测到 ASP.NET Web Pages 的冲突版本: 指定的版本为“1.0.0.0”,而 bin 中的版本为“2.0.0.0”.要继 ...

  4. [UE4]计算机中的数据表示

    一.位:数据的最小单位,一个位仅有两种状态 一个电路,通或断:磁盘上的小磁铁,南极或北极: 使用Bit表示位,百兆带宽,一秒钟可以传输一百兆个bit 二.字节:8个位组成一个字节,一个字节有256种状 ...

  5. JSON Web Token的使用(转载)

    定义 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息. 适用场景 1.用于向Web应用传递一些非敏感信息.例如完成加好友.下 ...

  6. Ubuntu下Code::Blocks错误

    #error This file requires compiler and library support for the ISO C++ 2011 standard. This support i ...

  7. Web 下载图片为空

    问题描述: 文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载.但是下载任务正常进行,下载下来的图片却是空 问题代码: //从服务器下载一张 ...

  8. Java Internet

    网络通信: 网络通信三要素: IP 协议 端口 TCP: 建立连接,发送速度慢 三次握手协议 UDP: 不需要建立连接,发送速度快 安全性低 a) 使用UDP实现数据的发送 1 创建Socket端点实 ...

  9. python之路之装饰器

    一 装饰器进化之路1) import time def index(): start_time=time.time() time.sleep() print('welcome to index wor ...

  10. DOS 批处理命令For循环命令详解

    for命令是一种对一系列对象依次循环执行同一个或多个命令的在命令行或批处理中运行的命令,结合一些Windows管理中的程序后,其处理功能强大.应用灵活方便程度令人刮目相看   for命令是一种对一系列 ...