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 }
posted @ 2012-07-28 10:09  Naix_x  阅读(158)  评论(0编辑  收藏  举报