【树状数组】[CQBZOJ2719]上帝造题的七分钟I

输入
输入数据的第一行为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);
        }
    }
}
posted @ 2015-09-24 13:28  outer_form  阅读(167)  评论(0编辑  收藏  举报