POJ1195 二维树状数组
Posted logeadd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1195 二维树状数组相关的知识,希望对你有一定的参考价值。
题目大意
给一个初始全0的矩阵,操作1为将(i,j)处的元素加上k
操作2为输出子矩阵(a,b)(c,d)的所有元素和
操作3为结束程序
二维树状数组模板
唯一要注意的是题目中从0开始标号,所以要将所有的坐标都加1再进行操作
# include<iostream> # include<cstdio> # include<cmath> # include<algorithm> const int mn = 1035; int n; struct Binary_tree{ int tr[mn][mn]; void add(int x,int y,int val) { for(int i=x;i<=n;i+=i&-i) for(int j=y;j<=n;j+=j&-j) tr[i][j]+=val; } int qsum(int x,int y) { int ret=0; for(int i=x;i>0;i-=i&-i) for(int j=y;j>0;j-=j&-j) ret+=tr[i][j]; return ret; } }A; int main() { int opt,a,b,c,d; scanf("%d%d",&opt,&n); while(1) { scanf("%d",&opt); if(opt==3) break; else if(opt==1) { scanf("%d%d%d",&a,&b,&c); A.add(a+1,b+1,c); } else { scanf("%d%d%d%d",&a,&b,&c,&d); ++a,++b,++c,++d; printf("%d\n",A.qsum(c,d)+A.qsum(a-1,b-1)-A.qsum(c,b-1)-A.qsum(a-1,d)); } } return 0; }
以上是关于POJ1195 二维树状数组的主要内容,如果未能解决你的问题,请参考以下文章