浅谈离线分治算法: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. Delphi 2005 以上版本GIF动画播放设置

    源: Delphi 2005 以上版本GIF动画播放设置

  2. MySQL-版本及服务介绍

    一.MySQL各版本 1.MySQL产品 下载地址:https://www.mysql.com/downloads/ Oracle MySQL Cloud Service(commercial) 商业 ...

  3. P4755 Beautiful Pair

    题目 洛谷 做法 \(i≤x≤j,a[i]<\frac{a[x]}{a[j]}\) 考虑\(a[x]\)的贡献,单调栈预处理\(L,R\)能作为最大值的区间 枚举一端点,仅需另一端点满足条件即可 ...

  4. OC_id类型

     博客正式开通啦!以后会每天为大家更新知识,将过去学习的笔记发布出来.供大家学习交流. 在Objective-C 中,id 类型是一个独特的数据类型.在概念上,类似Java 的Object 类,可以转 ...

  5. 一个gpio 不受控制的bug

    前几天调试一个flash灯的驱动程序,这可ic 有两个控制pin, 一个叫en1 一个叫en2, 根据spec的说明,不同的组合将产生不同的输出电流.但我发现,那个en1 这个pin 死活是拉不高的, ...

  6. springboot+mybatis+springSecurity+thymeleaf

    配置步骤: .pom <dependencies> <dependency> <groupId>org.springframework.security</g ...

  7. HDU 5884 Sort(2016年青岛网络赛 G 二分+贪心+小优化)

    好题 题意:给你n<=100000个数,每个数范围[0,1000],然后给你一个最大的代价T,每次最多合并k个数成为一个数,代价为k个数的总和.问最后合成1个数的总代价不大于T的最小k 题解:我 ...

  8. Regular Expression Matching,regex,正则表达式匹配,利用动态规划

    问题描述:Implement regular expression matching with support for '.' and '*'. '.' Matches any single char ...

  9. 用SQL语句删除除了id不同,其他都相同的学生表信息

    delete from <table_name> wehere id not in (select max(id) from <table_name> group by < ...

  10. 中安装rackspace private cloud --6 Deployment rpc

    运行ansible playbook安装之前的准备工作: Perform deployment host initial setup Build containers on target hosts ...