BZOJ2716:[Violet 3]天使玩偶
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=2716
对于每个询问,分为四部分来做。
1、左下角:用\(x+y+tmp\)来更新答案,\(tmp\)表示在这个询问点的左下角的点中\(-x-y\)的最小值。
2、左上角:用\(x-y+tmp\)来更新答案,\(tmp\)表示在这个询问点的左上角的点中\(-x+y\)的最小值。
3、右上角:用\(-x-y+tmp\)来更新答案,\(tmp\)表示在这个询问点的右上角的点中\(x+y\)的最小值。
4、右下角:用\(-x+y+tmp\)来更新答案,\(tmp\)表示在这个询问点的右下角的点中\(x-y\)的最小值。
然后一开始就把序列排好序,像整体二分一样先统计当前层的信息再分流递归下去。略微卡常。
时间复杂度:\(O((n+m)log^2(n+m))\)
空间复杂度:\(O(n+m)\)
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define low(i) ((i)&(-(i)))
const int maxn=5e5+5;
int ans[maxn];
int n,m,ans_cnt,maxlen;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct Oper {
int opt,id,x,y,tim;
Oper() {}
Oper(int _opt,int _id,int _x,int _y,int _tim) {
opt=_opt,id=_id,x=_x,y=_y,tim=_tim;
}
}p[maxn<<1],tmp[maxn<<1];
struct tree_array {
int top;
bool bo[1000005];
int stk[1000005],c[1000005];
void change(int pos,int v) {
for(int i=pos;i<=maxlen;i+=low(i)) {
if(!bo[i])bo[i]=1,stk[++top]=i;
c[i]=min(c[i],v);
}
}
void reset() {
while(top)bo[stk[top]]=0,c[stk[top]]=c[0],top--;
}
int query(int pos) {
int res=c[0];
for(int i=pos;i;i-=low(i))
res=min(res,c[i]);
return res;
}
}T[2];
bool cmp(Oper a,Oper b) {
if(a.x==b.x)return a.tim<b.tim;
return a.x<b.x;
}
void solve(int l,int r) {
if(l==r)return;
int mid=(l+r)>>1;
for(int i=l;i<=r;i++)
if(p[i].opt==1&&p[i].tim<=mid) {
T[0].change(p[i].y,-p[i].x-p[i].y);
T[1].change(maxlen-p[i].y+1,-p[i].x+p[i].y);
}
else if(p[i].opt==2&&p[i].tim>mid) {
ans[p[i].id]=min(ans[p[i].id],p[i].x+p[i].y+T[0].query(p[i].y));
ans[p[i].id]=min(ans[p[i].id],p[i].x-p[i].y+T[1].query(maxlen-p[i].y+1));
}
T[0].reset(),T[1].reset();
for(int i=r;i>=l;i--)
if(p[i].opt==1&&p[i].tim<=mid) {
T[0].change(p[i].y,p[i].x-p[i].y);
T[1].change(maxlen-p[i].y+1,p[i].x+p[i].y);
}
else if(p[i].opt==2&&p[i].tim>mid) {
ans[p[i].id]=min(ans[p[i].id],-p[i].x+p[i].y+T[0].query(p[i].y));
ans[p[i].id]=min(ans[p[i].id],-p[i].x-p[i].y+T[1].query(maxlen-p[i].y+1));
}
T[0].reset(),T[1].reset();
int cnt1=l,cnt2=mid+1;
for(int i=l;i<=r;i++)
if(p[i].tim<=mid)tmp[cnt1++]=p[i];
else tmp[cnt2++]=p[i];
for(int i=l;i<=r;i++)
p[i]=tmp[i];
solve(l,mid),solve(mid+1,r);
}
int main() {
n=read(),m=read();
for(int i=1;i<=n;i++) {
int x=read(),y=read();
p[i]=Oper(1,0,x,y,i);
maxlen=max(maxlen,y);
}
for(int i=0;i<2;i++)
memset(T[i].c,127,sizeof(T[i].c));
memset(ans,127,sizeof(ans));
for(int i=1;i<=m;i++) {
int opt=read(),x=read(),y=read(),id=opt==2?++ans_cnt:0;
p[n+i]=Oper(opt,id,x,y,n+i),maxlen=max(maxlen,y);
}
sort(p+1,p+m+n+1,cmp);
solve(1,n+m);
for(int i=1;i<=ans_cnt;i++)
printf("%d\n",ans[i]);
return 0;
}
BZOJ2716:[Violet 3]天使玩偶的更多相关文章
- [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)
[BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...
- bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*
bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...
- 【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 ...
- BZOJ2648: SJY摆棋子&&2716: [Violet 3]天使玩偶
BZOJ2648: SJY摆棋子 BZOJ2716: [Violet 3]天使玩偶 BZOJ氪金无极限... 其实这两道是同一题. 附上2648的题面: Description 这天,SJY显得无聊. ...
- BZOJ 2716: [Violet 3]天使玩偶
2716: [Violet 3]天使玩偶 Time Limit: 80 Sec Memory Limit: 128 MBSubmit: 1473 Solved: 621[Submit][Statu ...
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- bzoj 2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 --kdtree
2648: SJY摆棋子&&2716: [Violet 3]天使玩偶 Time Limit: 20 Sec Memory Limit: 128 MB Description 这天,S ...
随机推荐
- Linux文件系统管理 文件系统
概述 文件系统:文件系统这个名词大家都很陌生,不过如果说成分区,大家就比较容易理解了.原先每个分区只能格式化为一个文件系统,所以我们可以认为文件系统就是指分区.不过随着技术的进步,现在一个文件系统可以 ...
- [原创]spring及springmvc精简版--IOC
本篇博客为自己学习spring和springmvc的一个总结.主要以代码为主,至于文字性描述理解性东西,可以自行百度.有认识不妥的地方,还望指出,相互学习. 以前很困惑spring中的一些概念,在学习 ...
- 大数据架构之:Spark
Spark是UC Berkeley AMP 实验室基于map reduce算法实现的分布式计算框架,输出和结果保存在内存中,不需要频繁读写HDFS,数据处理效率更高Spark适用于近线或准实时.数据挖 ...
- linux alsa pcm(此pcm非硬件pcm接口)
转:https://blog.csdn.net/crycheng/article/details/7095899 CODEC :音频芯片的控制,比如静音.打开(关闭)ADC(DAC).设置ADC(DA ...
- iOS_XML与JSON解析
XML与JSON简介 XML 可扩展标记语言 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言 易读性高,编码手写难度小,数据量 ...
- FreeMarker 使用实例
以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... - ...
- java.lang.NullPointerException报错的几种情况
java.lang.NullPointerException报错的几种情况: 1.字符串变量未初始化: 2.接口类型的对象没有用具体的类初始化,比如: List stuList :这种情况就会报空指针 ...
- AJAX跨域资源共享 CORS 详解
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...
- 基于canvas与原生JS的H5动画引擎
前一段时间项目组里有一些H5动画的需求,由于没有专业的前端人员,便交由我这个做后台的研究相关的H5动画技术. 通过初步调研,H5动画的实现大概有以下几种方式: 1.基于css实现 这种方式比较简单易学 ...
- Apache Phoenix的子查询
Phoenix现在支持在WHERE 和FROM 中使用子查询.子查询可以被指定在很多地方,比如 IN/NOT IN, EXISTS/NOTEXISTS等. Subqueries with INor N ...