POJ 1195 Mobile phones(二维树状数组)
赤裸裸的二维树状数组,不用变形什么的。二维树状数组p[i][j]代表的i-lowbit(i)+1 to i ,j-lowbit(j)+1 to j 这个矩阵的和,insert和getsum函数做了一下改变,用两个for来实现插入和求和。又忘记 树状数组 不能为 0,调试了一会,再就是 对求某个区间的和,还是不是很熟悉wa了几次。如求(x1,y1)到(x2,y2)的和,画画图像可以很快得到公式。
getsum(x2,y2)+getsum(x1-1,y1-1)-getsum(x2,y1-1)-getsum(x1-1,y2);
1 #include <stdio.h> 2 #include <string.h> 3 int p[1025][1025],m; 4 int lowbit(int t) 5 { 6 return (-t)&t; 7 } 8 void insert(int x,int y,int d) 9 { 10 int i,j; 11 for(i = x;i <= m;i += lowbit(i)) 12 { 13 for(j = y;j <= m;j += lowbit(j)) 14 p[i][j] += d; 15 } 16 } 17 int getsum(int x,int y) 18 { 19 int sum = 0,i,j; 20 for(i = x;i >= 1;i -= lowbit(i)) 21 { 22 for(j = y;j >= 1;j -= lowbit(j)) 23 sum += p[i][j]; 24 } 25 return sum; 26 } 27 int main() 28 { 29 int n,x,y,a,l,b,r,t; 30 for(;;) 31 { 32 scanf("%d",&n); 33 if(n == 3)break; 34 if(n == 0) 35 { 36 scanf("%d",&m); 37 } 38 else if(n == 1) 39 { 40 scanf("%d%d%d",&x,&y,&a); 41 insert(x+1,y+1,a); 42 } 43 else if(n == 2) 44 { 45 scanf("%d%d%d%d",&l,&b,&r,&t); 46 printf("%d\n",getsum(r+1,t+1)+getsum(l,b)-getsum(l,t+1)-getsum(r+1,b)); 47 } 48 } 49 return 0; 50 }