POJ 1195
这是一道二维的树状数组。与一维不同之处在于更新和求和都多了一重循环:
更新:
void update(int a,int b,int val) { int i,j; for(i=b;i<=lmt;i+=lowbit(i)) { for(j=a;j<=lmt;j+=lowbit(j)) { c[i][j]+=val; } } }
求和:
int get_sum(int a,int b) { int i,j,sum=0; for(i=b;i>0;i-=lowbit(i)) { for(j=a;j>0;j-=lowbit(j)) { sum+=c[i][j]; } } return sum; }
这道题主要是求矩阵中所有元素的和,用树状数组的原因就是为了加快求和速度。要注意的地方是求一个位于总的矩阵中间的矩阵时要加的部分和要减的部分,在纸上画图就能够发现。
#include<stdio.h> #include<string.h> #define MAX_SIZE 1050 int c[MAX_SIZE][MAX_SIZE],lmt; int get_sum(int,int); inline int lowbit(int); void update(int,int,int); int main() { int type; while(scanf("%d",&type)!=EOF&&type!=3) { if(type==0) { int i,j; scanf("%d",&lmt); for(i=0;i<=lmt;i++) { for(j=0;j<=lmt;j++) { c[i][j]=0; } } } else if(type==1) { int a,b,val; scanf("%d%d%d",&a,&b,&val); a++;b++; update(a,b,val); } else { int l,r,b,t; scanf("%d%d%d%d",&l,&b,&r,&t); l++;b++;r++;t++; printf("%d\n",get_sum(r,t)-get_sum(l-1,t)-get_sum(r,b-1)+get_sum(l-1,b-1));//这里要稍微想一下 } } return 0; } inline int lowbit(int x) { return x&-x; }