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 }

你可能感兴趣的:(mobile)