题意: 一个二维数组,所有的数初始为0,会有两种操作:把某一个元素加上一个数(可负);查询某一块方形区域所有数的和。要求程序返回查询结果。
数据范围: 数组没一维大小 S <= 1024, 所有操作总次数 U < 60000 同时保证数组中所有数之和 M < 2^30 ,每个元素 0 <= V <= 32767
解析: 二维树状数组的纯模版题,没什么好说的。
代码:
#include <stdio.h>
#include <string.h>
#define MAXN 1100
int C[MAXN][MAXN];
int n;
void UpDate(int x,int y,int v){
int i,j;
for(i = x;i <= n;i += i&(-i)){
for(j = y;j <= n;j += j&(-j)){
C[i][j] += v;
}
}
}
int GetSum(int x,int y){
int i,j;
int sum = 0;
for(i = x;i > 0;i -= i&(-i)){
for(j = y;j > 0;j -= j&(-j)){
sum += C[i][j];
}
}
return sum;
}
int main(){
int cmd;
while(scanf("%d",&cmd) ,cmd != 3){
switch(cmd){
case 0:
memset(C,0,sizeof(C));
scanf("%d",&n);
break;
case 1:
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
UpDate(a + 1,b + 1,v);
break;
case 2:
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
printf("%d\n",GetSum(x2 + 1,y2 + 1) - GetSum(x2 + 1,y1) - GetSum(x1,y2 + 1) + GetSum(x1,y1));
break;
}
}
return 0;
}