输入
输入数据的第一行为X n m,代表矩阵大小为n×m。
从输入数据的第二行开始到文件尾的每一行会出现以下两种操作:
L a b c d delta —— 代表将(a,b),(c,d)为顶点的矩形区域内的所有数字加上delta。
K a b c d —— 代表求(a,b),(c,d)为顶点的矩形区域内所有数字的和。
请注意,k为小写。
对于10%的数据,1 ≤ n ≤ 16, 1 ≤ m ≤ 16, 操作不超过200个.
对于60%的数据,1 ≤ n ≤ 512, 1 ≤ m ≤ 512.
对于100%的数据,1 ≤ n ≤ 2048, 1 ≤ m ≤ 2048, 1 ≤ delta ≤ 500,操作不超过200000个,保证运算过程中及最终结果均不超过32位带符号整数类型的表示范围。
输出
针对每个K操作,在单独的一行输出答案。
二维树状数组区间修改、查询裸题。
#include<cstdio>
#define MAXN 2048
int n,m,c[MAXN+10][MAXN+10],ci[MAXN+10][MAXN+10],cj[MAXN+10][MAXN+10],cij[MAXN+10][MAXN+10];
void Read(int &x){
char c;
while(c=getchar(),c!=EOF)
if(c>='0'&&c<='9'){
x=c-'0';
while(c=getchar(),c>='0'&&c<='9')
x=x*10+c-'0';
ungetc(c,stdin);
return;
}
}
inline int lowbit(int x){
return x&-x;
}
void update(int x,int y,int d,int c[][MAXN+10]){
int j;
for(;x<=n;x+=lowbit(x))
for(j=y;j<=m;j+=lowbit(j))
c[x][j]+=d;
}
int getsum(int x,int y,int c[][MAXN+10]){
int j,ret=0;
for(;x;x-=lowbit(x))
for(j=y;j;j-=lowbit(j))
ret+=c[x][j];
return ret;
}
int main()
{
char cc;
int x1,x2,y1,y2,d;
scanf("%s",&cc);
Read(n),Read(m);
while(scanf("%s",&cc)!=EOF){
if(cc=='L'){
Read(x1),Read(y1),Read(x2),Read(y2),Read(d);
update(x1,y1,d,c);
update(x1,y1,d*x1,ci);
update(x1,y1,d*y1,cj);
update(x1,y1,d*x1*y1,cij);
update(x1,y2+1,-d,c);
update(x1,y2+1,-d*x1,ci);
update(x1,y2+1,-d*(y2+1),cj);
update(x1,y2+1,-d*x1*(y2+1),cij);
update(x2+1,y1,-d,c);
update(x2+1,y1,-d*(x2+1),ci);
update(x2+1,y1,-d*y1,cj);
update(x2+1,y1,-d*(x2+1)*y1,cij);
update(x2+1,y2+1,d,c);
update(x2+1,y2+1,d*(x2+1),ci);
update(x2+1,y2+1,d*(y2+1),cj);
update(x2+1,y2+1,d*(x2+1)*(y2+1),cij);
}
else{
Read(x1),Read(y1),Read(x2),Read(y2);
int a1,a2,a3,a4;
a1=getsum(x2,y2,c)*(y2+1)*(x2+1)-getsum(x2,y2,ci)*(y2+1)-getsum(x2,y2,cj)*(x2+1)+getsum(x2,y2,cij);
a2=getsum(x1-1,y2,c)*x1*(y2+1)-getsum(x1-1,y2,ci)*(y2+1)-getsum(x1-1,y2,cj)*x1+getsum(x1-1,y2,cij);
a3=getsum(x2,y1-1,c)*(x2+1)*y1-getsum(x2,y1-1,ci)*y1-getsum(x2,y1-1,cj)*(x2+1)+getsum(x2,y1-1,cij);
a4=getsum(x1-1,y1-1,c)*x1*y1-getsum(x1-1,y1-1,ci)*y1-getsum(x1-1,y1-1,cj)*x1+getsum(x1-1,y1-1,cij);
printf("%d\n",a1-a2-a3+a4);
}
}
}