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 }
To Be The Best Of Yourself