poj 1195 Mobile phones 二维树状数组

题意:n*n的矩阵 

定义两种操作:

1 x y a 把(x,y)的权值加a

2 l b r t 查询 子矩阵(l,b) ~(r,t)  的和

 

思路:二维树状数组

 1 #include<iostream>
2 using namespace std;
3 #define MAXN 1200
4 int tree[MAXN][MAXN];
5 int n;
6 int lowbit(int x)
7 {
8 return x&(x^(x-1));
9 }
10 void update(int x,int y,int a)
11 {
12 for(int i=x;i<=n;i+=lowbit(i))
13 for(int j=y;j<=n;j+=lowbit(j))
14 tree[i][j]+=a;
15 }
16 int sum(int x,int y)
17 {
18 int ans=0;
19 for(int i=x;i>0;i-=lowbit(i))
20 for(int j=y;j>0;j-=lowbit(j))
21 ans+=tree[i][j];
22 return ans;
23 }
24 int main()
25 {
26 int x,y,a,l,b,r,t,z;
27 int i,j;
28 while(scanf("%d",&z)&&z!=3)
29 {
30 if(z==0)
31 {
32 scanf("%d",&n);
33 memset(tree,0,sizeof(tree));
34 continue;
35 }
36 if(z==2)
37 {
38 scanf("%d%d%d%d",&l,&b,&r,&t);
39 l++; b++; r++; t++;
40 printf("%d\n",sum(r,t)-sum(l-1,t)-sum(r,b-1)+sum(l-1,b-1));
41 }
42 else
43 {
44 scanf("%d%d%d",&x,&y,&a);
45 update(x+1,y+1,a);
46 }
47 }
48 return 0;
49 }
50
51



posted on 2012-02-26 09:48  myoi  阅读(195)  评论(0编辑  收藏  举报

导航