BZOJ4170 极光 [二维线段树]
来源:互联网 发布:尚硅谷java视频教程 编辑:程序博客网 时间:2024/06/07 17:50
4170: 极光
Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 198 Solved: 100
[Submit][Status][Discuss]
Description
"若是万一琪露诺(俗称rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她。对方表现出兴趣的话,那就慢
慢地反问。在她考虑答案的时候,趁机逃吧。就算是很简单的问题,她一定也答不上来。"
–《上古之魔书》
天空中出现了许多的北极光,这些北极光组成了一个长度为n的正整数数列a[i],远古之魔书上记载到:2个位置的g
raze值为两者位置差与数值差的和:
graze(x,y)=|x-y|+|a[x]-a[y]|。
要想破解天罚,就必须支持2种操作(k都是正整数):
Modify x k:将第x个数的值修改为k。
Query x k:询问有几个i满足graze(x,i)<=k。
由于从前的天罚被圣王lmc破解了,所以rhl改进了她的法术,询问不仅要考虑当前数列,还要考虑任意历史版本,
即统计任意位置上出现过的任意数值与当前的a[x]的graze值<=k的对数。(某位置多次修改为同样的数值,按多次
统计)
Input
第1行两个整数n,q。分别表示数列长度和操作数。
第2行n个正整数,代表初始数列。
第3~q+2行每行一个操作。
N<=40000, 修改操作数<=60000, 询问操作数<=10000, Max{a[i]}(含修改)<=80000
Output
对于每次询问操作,输出一个非负整数表示答案
Sample Input
3 5
2 4 3
Query 2 2
Modify 1 3
Query 2 2
Modify 1 2
Query 1 1
Sample Output
3
3
HINT
Source
可以把坐标系旋转一下,点(x,y)变成(x+y,-x+y),这样查询曼哈顿距离<=k的就变成查边长为2k的正方形里的点的个数,然后用二维线段树乱搞就行了。。。。
#include<bits/stdc++.h>using namespace std;const int N = 200005 ,M = 20000007;int sz[M],a[N],son[M][2],tree[N<<2],n,m,lim=200000,limr=100000,liml=-100000,tot;char cmd[10];void changef(int &rt,int l,int r,int p){ if(!rt)rt=++tot; sz[rt]++; if(l==r)return ; int mid=(l+r)>>1; if(p>mid)changef(son[rt][1],mid+1,r,p); else changef(son[rt][0],l,mid,p);}void changes(int rt,int l,int r,int p,int q){ changef(tree[rt],liml,limr,q); if(l==r)return ; int mid=(l+r)>>1; if(p>mid)changes(rt<<1|1,mid+1,r,p,q); else changes(rt<<1,l,mid,p,q); }int queryf(int rt,int l,int r,int L,int R){ if(L<liml)L=liml; if(R>limr)R=limr; if(!rt)return 0; if(l==L&&r==R)return sz[rt]; int mid=(l+r)>>1; if(R<=mid)return queryf(son[rt][0],l,mid,L,R); else if(L>mid)return queryf(son[rt][1],mid+1,r,L,R); else return queryf(son[rt][0],l,mid,L,mid)+queryf(son[rt][1],mid+1,r,mid+1,R);}int querys(int rt,int l,int r,int li,int ri,int L,int R){ if(li<1)li=1; if(ri>lim)ri=lim; if(l==li&&ri==r)return queryf(tree[rt],liml,limr,L,R); int mid=(l+r)>>1; if(ri<=mid)return querys(rt<<1,l,mid,li,ri,L,R); else if(li>mid)return querys(rt<<1|1,mid+1,r,li,ri,L,R); else return querys(rt<<1,l,mid,li,mid,L,R)+querys(rt<<1|1,mid+1,r,mid+1,ri,L,R);}template<class T>inline void read(T &res){ static char ch;T flag=1; while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48; while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;}int main(){ read(n),read(m); for(register int i=1;i<=n;i++)read(a[i]),changes(1,1,lim,i+a[i],-i+a[i]); for(register int x,y,i=1;i<=m;i++){ scanf("%s",cmd); read(x),read(y); if(cmd[0]=='Q')printf("%d\n",querys(1,1,lim,x+a[x]-y,x+a[x]+y,-x+a[x]-y,-x+a[x]+y)); else a[x]=y,changes(1,1,lim,x+y,-x+y); } return 0;}
阅读全文
0 0
- BZOJ4170 极光 [二维线段树]
- bzoj4170 极光
- BZOJ4170: 极光
- BZOJ4170: 极光
- BZOJ2989 数列/BZOJ4170 极光
- BZOJ4170 极光(CDQ分治 或 树套树)
- 二维线段树
- poj1656----二维线段树
- poj2155 二维线段树
- hdu1823 二维线段树
- POJ2155 二维线段树
- hdu1823 二维线段树
- HDU1823(二维线段树)
- poj2155 二维线段树
- CUGBACM_Summer_Tranning2【二维线段树】
- 二维线段树
- hdu1823 二维线段树
- hdu4819 二维线段树
- redis实现消息队列
- Android:在程序运行时申请权限(第一行代码android)
- mongodb各种操作命令
- 统计前面比自己小的数的个数-LintCode
- Android 6.0动态申请权限
- BZOJ4170 极光 [二维线段树]
- 形象解释PID算法+PID算法源代码
- 深度学习硬件指南(号称最全)
- 解决“未能加载文件或程序集“netfx.force.conflicts”或它的某一个依赖项”
- 异常(一)
- GKQuadtree
- JSTL格式化日期
- PDF任务该怎样在ABBYY FineReader 中定义
- 第四周项目三 单链表应用