题意:有一个n*n的矩阵,op==1时,在(x,y)增加值z,op==2时,求以(x1,y1)和(x2,y2)构成的矩阵的和。
思路:二维线段树。
代码:
1 #include<stdio.h> 2 #include<string.h> 3 const int N=1111; 4 int c[N][N],n; 5 int lowbit(int x) 6 { 7 return x&-x; 8 } 9 void add(int x,int y,int z) 10 { 11 for(int i=x;i<=n;i=(i|(i-1))+1) 12 for(int j=y;j<=n;j=(j|(j-1))+1) 13 c[i][j]+=z; 14 } 15 int q(int x,int y) 16 { 17 int sum=0; 18 for(int i=x;i;i=i&(i-1)) 19 for(int j=y;j;j=j&(j-1)) 20 sum+=c[i][j]; 21 return sum; 22 } 23 int main() 24 { 25 int op,x,y,z,x1,x2,y1,y2; 26 while(scanf("%d%d",&op,&n)!=EOF) 27 { 28 memset(c,0,sizeof(c)); 29 while(scanf("%d",&op)&&op!=3) 30 { 31 if(op==1) 32 { 33 scanf("%d%d%d",&x,&y,&z); 34 add(x+1,y+1,z); 35 } 36 else 37 { 38 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 39 x1++,x2++,y1++,y2++; 40 printf("%d ",q(x2,y2)+q(x1-1,y1-1)-q(x2,y1-1)-q(x1-1,y2)); 41 } 42 } 43 } 44 return 0; 45 } 46 /* 47 i -= lowbit(i) == i = i&(i-1) 48 i += lowbit(i) == i = (i|(i-1))+1 49 */
参考文章:http://blog.csdn.net/hit_lingo/article/details/50845718
http://www.cnblogs.com/yejinru/archive/2012/03/22/2412359.html