题目链接:http://poj.org/problem?id=1195
纯纯的二维树状数组,不解释,只需要注意一点,由于题目中的数组从0开始计算,所以维护的时候需要加1。因为树状数组的下标是不能为1的
代码:
#include <iostream> #include <cstdio> #define N 1030 using namespace std; int c[N][N]; int cas,n,x,y,a,l,b,r,t; int Lowbit(int x) { return x & (-x); } void Updata(int x,int y,int a) { int i,k; for(i=x; i<=n; i+=Lowbit(i)) for(k=y; k<=n; k+=Lowbit(k)) c[i][k]+=a; } int Getsum(int x,int y) { int i,k,sum = 0; for(i=x; i>0; i-=Lowbit(i)) for(k=y; k>0; k-=Lowbit(k)) sum += c[i][k]; return sum; } int main() { scanf("%d%d",&cas,&n); while(~scanf("%d",&cas)) { if(cas==1) { scanf("%d%d%d",&x,&y,&a); Updata(x+1,y+1,a); } if(cas==2) { scanf("%d%d%d%d",&l,&b,&r,&t); int a=Getsum(r+1,t+1)-Getsum(l,t+1)-Getsum(r+1,b)+Getsum(l,b); printf("%d\n",a); } if(cas==3) return 0; } return 0; }
POJ_1195 Mobile phones 【二维树状数组】,布布扣,bubuko.com
POJ_1195 Mobile phones 【二维树状数组】
原文:http://blog.csdn.net/u013912596/article/details/33802561