浅谈离线分治算法: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]天使玩偶的更多相关文章

  1. [BZOJ2716] [Violet 3]天使玩偶(CDQ分治)

    [BZOJ2716] [Violet 3]天使玩偶(CDQ分治) 题面 Ayu 在七年前曾经收到过一个天使玩偶,当时她把它当作时间囊埋在了地下.而七年后 的今天,Ayu 却忘了她把天使玩偶埋在了哪里, ...

  2. bzoj2648SJY摆棋子&&bzoj2716[Violet 3]天使玩偶*

    bzoj2648SJY摆棋子 bzoj2716[Violet 3]天使玩偶 题意: 棋盘上有n个棋子,现在有m个操作,一种是加棋子,一种是查询离某个点最近的棋子.n,m≤500000. 题解: 先将已 ...

  3. 【kd-tree】bzoj2716 [Violet 3]天使玩偶

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  4. bzoj2716: [Violet 3]天使玩偶

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  5. BZOJ2716 [Violet 3]天使玩偶 【CDQ分治】

    题目 输入格式 输出格式 输入样例 //样例太长就不贴了.... 输出样例 //见原题 提示 题解 我们将曼哈顿距离式子中的绝对值去掉,每次只考虑x,y比当前点小的更新答案. 为了使所有点都对答案进行 ...

  6. 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 ...

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

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

  8. BZOJ 2716: [Violet 3]天使玩偶

    2716: [Violet 3]天使玩偶 Time Limit: 80 Sec  Memory Limit: 128 MBSubmit: 1473  Solved: 621[Submit][Statu ...

  9. BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )

    先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...

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

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

随机推荐

  1. 【Topcoder】SRM158 DIV2总结

    250分题:给定一个4位字符串initial和rotate这个字符串的方式,然后再给另一个字符串current,问current能否由initial通过rotate得到,需要几次rotate? 简单的 ...

  2. UVA11297 Census

    题目 UVA11297 Census 做法 二维线段树,单点修改,矩阵查询,树套树(\(x,y\)),维护最大值最小值废话 有一点要注意的是:\(x\)树传到\(y\)树里面修改的时候,如果\(x\) ...

  3. 主攻ASP.NET.4.5.1 MVC5.0之重生:创建UIHelper通用自定义分页和选择开关与PagesHelper和IsSelect简单用法

    @helper放入地方 分页效果 选择开关编辑调用 <dl> <dd class="dc1">是否主管:</dd> <dd> @UI ...

  4. 单周期CPU设计

    终于有点时间了,恰好多周期的设计也已经完成,其实只想写写多周期的,无奈单周期补上才好,哈哈哈~ —————+—————黄金分割线—————+————— 首先要理解什么叫单周期CPU(与后面多周期CPU ...

  5. Python之print语句Python的注释

    话不多说直接切入正题 print语句可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下: >>> print 'hello, world' 注意: 1. ...

  6. python 之CORS,VUE+rest_framework示例

    一.跨域     浏览器的同源策略                 ----对ajax请求进行阻拦                 ----对href属性读不阻拦        xhr=new XML ...

  7. 碰到错误Could not load the Tomcat server configuration at \Servers\MyEclipse Tomcat v8.5-config. The Servers project is closed.

    本人用的myeclipse是2017版. 可能解决的方法是: 双击MyEclipse Tomcat v8.5,然后就会弹出以下窗口,

  8. 万字总结:学习MySQL优化原理,这一篇就够 了!【转】

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...

  9. QQ发送位置(高德地图)

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...

  10. kylin_异常_01_java.io.FileNotFoundException: /developer/apache-kylin-2.3.0-bin/tomcat/conf/.keystore

    一.异常现象 kylin安装完,启动后,控制正常,kylin后台也能正常访问.但是去看kylin的日志,却发现报错了: SEVERE: Failed to load keystore type JKS ...