POJ 1195

二位树状数组裸题。

注意把下标换成从1开始,处理起来会简单很多。

上代码:

 1 #include<stdio.h>
 2 #include<iostream>
 3 using namespace std;
 4 
 5 #include<math.h>
 6 #include<algorithm>
 7 #include<string.h>
 8 #include<stdlib.h>
 9 #include<vector>
10 #include<set>
11 #include<map>
12 #include<stack>
13 #include<string>
14 #include<queue>
15 
16 #define repA(p,q,i)  for( int (i)=(p); (i)!=(q); ++(i) )
17 #define repAE(p,q,i)  for( int (i)=(p); (i)<=(q); ++(i) )
18 #define repD(p,q,i)  for( int (i)=(p); (i)!=(q); --(i) )
19 #define repDE(p,q,i)  for( int (i)=(p); (i)>=(q); --(i) )
20 #define range 1100
21 
22 int s[range][range];
23 int n;
24 int ope,x,y,a,l,b,r,t;
25 
26 int lowbit(int i);
27 void update(int x,int y,int a);
28 int sum(int x, int y);
29 
30 int main()
31 {
32     memset(s,0,sizeof(s) );
33     while( scanf("%d",&ope) != EOF  &&  ope != 3)
34     {
35         if(ope == 0)
36             scanf("%d",&n);
37         else if(ope == 1)
38         {
39             scanf("%d%d%d",&x,&y,&a);
40             ++x; ++y;
41             update(x,y,a);
42         }
43         else if(ope == 2)
44         {
45             scanf("%d%d%d%d",&l,&b,&r,&t);
46             ++l; ++b; ++r; ++t;
47             //cout<<sum(r,t)<<endl;
48             cout<<sum(r,t)-sum(r,b-1) - ( sum(l-1,t) - sum(l-1,b-1) )<<endl;
49         }
50     }
51     return 0;
52 }
53 
54 int lowbit(int i)
55 {
56     return i&(-i);
57 }
58 
59 void update(int x, int y, int a)
60 {
61     for(int i=y; i<=n; i += lowbit(i) )
62       for(int j=x; j<=n; j += lowbit(j) )
63         s[i][j] += a;
64     return;
65 }
66 
67 int sum(int x, int y)
68 {
69     int all = 0;
70     for(int i=y; i>0; i -= lowbit(i) )
71       for(int j=x; j>0; j -= lowbit(j) )
72         all += s[i][j];
73     return all;
74 }
View Code

 

posted on 2013-11-20 16:32  码农之上~  阅读(201)  评论(0编辑  收藏  举报

导航