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 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/07/28/2612837.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值