题目连接:
题意:要求设计这样一个数据结构,支持下列操作
1.add(x,y,a).对二维数组的第x行,第y列加上a.
2.sum(l,b,r,t).求所有满足l<=x<=r,b<=y<=t,的数组元素的和
二位树状数组~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <string.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define loop(s,i,n) for(i = s;i <= n;i++) 6 #define lowbit(x) x&-x 7 using namespace std; 8 int c[1050][1050]; 9 int n; 10 void add(int a,int b,int val) 11 { 12 int i,j; 13 for(i = a;i <= n;i += lowbit(i)) 14 { 15 for(j = b;j <= n;j += lowbit(j)) 16 c[i][j] += val; 17 } 18 } 19 20 int sum(int a,int b) 21 { 22 int res = 0; 23 int i,j; 24 for(i = a;i > 0;i -= lowbit(i)) 25 { 26 for(j = b;j > 0;j -= lowbit(j)) 27 res+=c[i][j]; 28 } 29 return res; 30 } 31 int main() 32 { 33 int t,i,j,a,b,l,r; 34 while(~scanf("%d",&t) != EOF) 35 { 36 if(!t) 37 { 38 scanf("%d",&n); 39 loop(1,i,n) 40 { 41 loop(1,j,n) 42 c[i][j] = 0; 43 } 44 } 45 if(t == 1) 46 { 47 scanf("%d %d %d",&a,&b,&l); 48 add(a+1,b+1,l); 49 } 50 else if(t == 2) 51 { 52 scanf("%d %d %d %d",&a,&b,&l,&r); 53 printf("%d ",sum(a,b)+sum(l+1,r+1)-sum(a,r+1)-sum(l+1,b)); 54 } 55 if(t == 3) 56 break; 57 } 58 return 0; 59 }