bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
题意:
棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子。n,m≤500000。
题解:
先将已有的棋子建kd树,然后加棋子就直接向kd树插入节点。因为本题数据弱,所以直接插节点不会T,如果是一些数据比较强的题目,需要在插入一定量节点后重构整棵树。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define maxn 500010
#define INF 0x3fffffff
using namespace std; inline int read(){
char ch=getchar(); int f=,x=;
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return f*x;
}
int n,m,f,rt,ans;
struct p{int pos[]; bool operator < (const p &a)const{return pos[f]<a.pos[f];}}ps[maxn];
struct nd{p pos; int mx[],mn[],lc,rc;}nds[maxn*];
int dis(p a,p b){return abs(a.pos[]-b.pos[])+abs(a.pos[]-b.pos[]);}
void update(int x){
inc(i,,){
if(nds[x].lc)
nds[x].mx[i]=max(nds[x].mx[i],nds[nds[x].lc].mx[i]),
nds[x].mn[i]=min(nds[x].mn[i],nds[nds[x].lc].mn[i]);
if(nds[x].rc)
nds[x].mx[i]=max(nds[x].mx[i],nds[nds[x].rc].mx[i]),
nds[x].mn[i]=min(nds[x].mn[i],nds[nds[x].rc].mn[i]);
}
}
int build(int l,int r,int now){
f=now; int mid=(l+r)>>; nth_element(ps+l,ps+mid,ps+r+);
inc(i,,)nds[mid].mx[i]=nds[mid].mn[i]=ps[mid].pos[i]; nds[mid].pos=ps[mid];
if(l<mid)nds[mid].lc=build(l,mid-,now^); if(mid<r)nds[mid].rc=build(mid+,r,now^);
update(mid); return mid;
}
void insert(int &x,p a,int now){
if(!x){x=++n; inc(i,,)nds[x].mx[i]=nds[x].mn[i]=a.pos[i]; nds[x].pos=a; return;}
f=now; if(a<nds[x].pos)insert(nds[x].lc,a,now^);else insert(nds[x].rc,a,now^); update(x);
}
int get(int x,p a){
int q=; inc(i,,)q+=max(a.pos[i]-nds[x].mx[i],),q+=max(nds[x].mn[i]-a.pos[i],); return q;
}
void query(int x,p a){
ans=min(ans,dis(a,nds[x].pos)); int dl=INF-,dr=INF-;
if(nds[x].lc)dl=get(nds[x].lc,a); if(nds[x].rc)dr=get(nds[x].rc,a);
if(dl<dr){
if(ans>dl)query(nds[x].lc,a); if(ans>dr)query(nds[x].rc,a);
}else{
if(ans>dr)query(nds[x].rc,a); if(ans>dl)query(nds[x].lc,a);
}
}
int main(){
n=read(); m=read(); inc(i,,n)ps[i].pos[]=read(),ps[i].pos[]=read(); rt=build(,n,);
inc(i,,m){
int t=read(),x=read(),y=read();
if(t==)insert(rt,(p){x,y},);else ans=INF,query(rt,(p){x,y}),printf("%d\n",ans);
}
return ;
}
20160906
bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*的更多相关文章
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
- 【BZOJ】2648: SJY摆棋子 & 2716: [Violet 3]天使玩偶(kdtree)
http://www.lydsy.com/JudgeOnline/problem.php?id=2716 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- 【kd-tree】bzoj2716 [Violet 3]天使玩偶
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- bzoj2716: [Violet 3]天使玩偶
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...
- BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】
题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...
- BZOJ2716: [Violet 3]天使玩偶(KD-Tree)
Description Input Output Sample Input 100 100 81 23 27 16 52 58 44 24 25 95 34 2 96 25 8 14 97 50 97 ...
- SJY摆棋子&&[Violet 3]天使玩偶
SJY摆棋子 https://www.lydsy.com/JudgeOnline/problem.php?id=2648 [Violet 3]天使玩偶 https://www.lydsy.com/Ju ...
随机推荐
- LR字符串处理函数-lr_save_datetime
void lr_save_datetime(const char *format, int offset, const char *name); 中文解释: lr_save_datetime将当前日期 ...
- mysql日期和时间类型
TIME 类型 TIME 类型用于只需要时间信息的值,在存储时需要 3 个字节.格式为 HH:MM:SS.HH 表示小时,MM 表示分钟,SS 表示秒. TIME 类型的取值范围为 -838:59:5 ...
- 鼠标悬停,使用css切换图片
鼠标悬停,使用css切换图片 当鼠标悬停在li上面切换另一张图片,只需添加下述css样式即可
- SpringBoot从入门到放弃之配置Spring-Data-JPA自动建表
pom文件配置引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- opencv c++访问某一区域
int main(){ cv::Mat m1(,, CV_8UC1); for(int i=;i<m1.rows;++i) for(int j=;j<m1.cols;++j) m1.at& ...
- 重学 Java 设计模式:实战命令模式「模拟高档餐厅八大菜系,小二点单厨师烹饪场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 持之以恒的重要性 初学编程往往都很懵,几乎在学习的过程中会遇到 ...
- Qt布局的简单介绍
1 介绍 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=25 布局的好处:布局之后,改变主窗口大小,其余窗口可以自适应. 2 布局分类 垂直 ...
- hello python week one
python的注释 好的pytho程序员不一定非要追求 代码的简短,代码的可读性也是至关重要的 与用户交互 输入 input 会将输入内容转化为字符串 输出 print 格式化输出 %d %s 占位符 ...
- SpringBoot--日期格式化
1.为了统一转转,可以使用日期格式化类 package com.example.demo.resource; import com.fasterxml.jackson.datatype.jsr310. ...
- vue基础入门(1)
1.vue初体验 1.1.vue简介 1.1.1.vue是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架,什么叫做渐进式呢?通俗的讲就是一层一层的,一步一 ...