bzoj2989: 数列&&4170: 极光
2017-08-25 10:12
337 查看
二维线段树搞搞。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int read() { char ch=getchar();int f=0; while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();} return f; } int n,m; int lim=200000; int liml=-100000,limr=100000; int a[200005],size[20000005],son[20000005][2],rt[800005],tot; void change(int &x,int y,int z,int p) { if(!x) { x=++tot; } size[x]++; if(y==z) return ; int mid=y+z>>1; if(p<=mid) change(son[x][0],y,mid,p); else change(son[x][1],mid+1,z,p); } void tochange(int x,int y,int z,int p,int pp) { change(rt[x],liml,limr,pp); if(y==z) return; int mid=y+z>>1; if(p<=mid) { tochange(x<<1,y,mid,p,pp); } else tochange(x<<1|1,mid+1,z,p,pp); } int ask(int x,int y,int z,int l,int r) { if(l<liml) l=liml; if(r>limr) r=limr; if(!x) return 0; if(y==l&&z==r) return size[x]; int mid=y+z>>1; if(r<=mid) return ask(son[x][0],y,mid,l,r); else if(l>mid) return ask(son[x][1],mid+1,z,l,r); else return ask(son[x][0],y,mid,l,mid)+ask(son[x][1],mid+1,z,mid+1,r); } int toask(int x,int y,int z,int l,int r,int L,int R) { if(l<1) l=1; if(r>lim) r=lim; if(y==l&&z==r) return ask(rt[x],liml,limr,L,R); int mid=y+z>>1; if(r<=mid) return toask(x<<1,y,mid,l,r,L,R); else if(l>mid) return toask(x<<1|1,mid+1,z,l,r,L,R); else return toask(x<<1,y,mid,l,mid,L,R)+toask(x<<1|1,mid+1,z,mid+1,r,L,R); } int main() { int x,y; char o[10]; n=read(),m=read(); for(int i=1;i<=n;i++) { a[i]=read(); tochange(1,1,lim,i+a[i],-i+a[i]); } while(m--) { scanf("%s",o); x=read(),y=read(); if(o[0]=='Q') { printf("%d\n",toask(1,1,lim,x+a[x]-y,x+a[x]+y,-x+a[x]-y,-x+a[x]+y)); } if(o[0]=='M') { a[x]=y; tochange(1,1,lim,x+y,-x+y); } } }
相关文章推荐
- BZOJ_2989_数列&&BZOJ_4170_极光_KDTree
- bzoj 2989: 数列&4170: 极光
- bzoj 2989&&4170: 数列
- [BZOJ]4170: 极光 2989: 数列 CDQ分治+树状数组
- bzoj2989&4170: 数列
- tyvj 1305 最大m子段和 单调队列 求连续l(1<=l<=k)个数的和的最大值 数列不可循环
- 【BZOJ 4170】 4170: 极光 (CDQ分治)
- 蓝桥杯2016年2月11日&nbsp;数列特征
- CCF——数列分段 && 日期计算
- XMU&nbsp;1465.连续数列
- hdu 3415 Max Sum of Max-K-sub-sequence 单调队列 求连续l(1<=l<=k)个数的和的最大值 数列可循环
- 网易2018年校园招聘编程题真题(魔法币&&相反数&&字符串碎片&&重排数列)
- Python 数列中的数的类型转换(Str<—>Int)
- 求Fibonacc数列中大于t(t>3)的最小一个数 例 带入1000输出1597
- 【Fibonacci 数列前四位&后四位】hdu 3117
- BZOJ4170 极光(CDQ分治 或 树套树)
- hdoj 吉哥系列故事——完美队形I 4512 (LICS&dp)单调增回文数列长度 好题
- subsets之给定一个数列&生成该数列所有的子集&升序
- HDU 1799:循环多少次?【dp & 数列组合】
- Convert Sorted List to Binary Search Tree——将链表转换为平衡二叉搜索树 &&convert-sorted-array-to-binary-search-tree——将数列转换为bst