1. 程式人生 > >POJ1195 二維樹狀數組

POJ1195 二維樹狀數組

二維 元素 div code scan 開始 sca size 輸出

題目大意

給一個初始全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 二維樹狀數組