一维和二维树状数组
2016-10-18 19:50
387 查看
#include<cstdio>//注意0的死循环 #include<cstring> #include<algorithm> #include<iostream> using namespace std; typedef long long int LL; const LL mod=1e9+7; LL n,m,x[1000010],arr[1010][1010]; LL lowbit(LL t)//求低位 0 会陷入死循环 { return t&(-t); } void update(LL i,LL add)//更新i节点加上add { while(i<=n) { x[i]+=add; i+=lowbit(i); } } LL getans(LL s)//求前s项和 { LL sum=0; while(s>0) { sum+=x[s]; s-=lowbit(s); } return sum; } void update2(LL a,LL b,LL add)//在x[a][b]处加add { for(LL i=a; i<=n+1; i+=lowbit(i)) for(LL j=b; j<=n+1; j+=lowbit(j)) arr[i][j]+=add; } LL getans2(LL a,LL b)//求x[a][b]的前面之和 { LL sum=0; for(LL i=a; i>0; i-=lowbit(i)) for(LL j=b; j>0; j-=lowbit(j)) sum+=arr[i][j]%mod; return sum%mod; } LL getans3(LL x1,LL y1,LL x2,LL y2)//求x1,y1, x2,y2的矩形里面之和 { LL ans=getans2(x2,y2)-getans2(x1-1,y2)-getans2(x2,y1-1)+getans2(x1-1,y1-1); while(ans<0) ans+=mod; return ans; } int main() { scanf("%lld%lld",&n,&m); memset(x,0,sizeof(x)); memset(arr,0,sizeof(arr)); string str; while(m--) { cin>>str; LL a,b,c,d; if(str[0]=='S') { scanf("%lld%lld%lld%lld",&a,&b,&c,&d); printf("%lld\n",getans3(a+1,b+1,c+1,d+1)); } else { scanf("%lld%lld%lld",&a,&b,&c); update2(a+1,b+1,c); } } }
相关文章推荐
- 树状数组小结 【一维二维 常用操作】
- 从一维树状数组到二维树状数组
- 树状数组的模板(一维和二维)
- 树状数组,一维,二维
- 树状数组( 单点修改/区间修改+区间求和+一维/二维)
- 一维与二维树状数组
- 一维树状数组和二维树状数组
- 树状数组(一维、二维)入门
- 树状数组的讲解感觉挺好,和我的一维,二维,树状数组的模板,希望对大家有用
- 一维树状数组和二维树状数组和三维树状数组的区间更新单点求值
- 【树状数组】树状数组一维二维模板
- 一维二维树状数组区间加与区间求和
- 一维 + 二维树状数组 + 单点更新 + 区间更新 详解
- POJ2155 Matrix 二维树状数组的应用
- [互联网面试笔试汇总C/C++-20] 如何申请一个大小为n的数组(一维或二维)
- POJ 1195 二维树状数组
- 【二维树状数组】HDU 1892
- 感想——树状数组和二维树状数组
- 【清澄A1333】【整体二分+二维树状数组】矩阵乘法(梁盾)
- bzoj3132 二维树状数组