BZOJ_3132_上帝造题的七分钟_树状数组

BZOJ_3132_上帝造题的七分钟_树状数组

Description

“第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵。

第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作。

第三分钟,k说,要能查询,于是便有了求给定矩形区域内的全部数字和的操作。

第四分钟,彩虹喵说,要基于二叉树的数据结构,于是便有了数据范围。

第五分钟,和雪说,要有耐心,于是便有了时间限制。

第六分钟,吃钢琴男说,要省点事,于是便有了保证运算过程中及最终结果均不超过32位有符号整数类型的表示范围的限制。

第七分钟,这道题终于造完了,然而,造题的神牛们再也不想写这道题的程序了。”

       ——《上帝造裸题的七分钟》

所以这个神圣的任务就交给你了。

Input

 输入数据的第一行为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为小写。


        

Output

针对每个k操作,在单独的一行输出答案。

Sample Input

X 4 4
L 1 1 3 3 2
L 2 2 4 4 1
k 2 2 3 3

Sample Output

12

HINT

对于100%的数据,1 ≤ n ≤ 2048, 1 ≤ m ≤ 2048, 1 ≤ abs(delta) ≤ 500,操作不超过200000个,保证运算过程中及最终结果均不超过32位带符号整数类型的表示范围。

 

 


 

二维树状数组区间修改...

先想想一维树状数组怎么实现区间修改。

差分,开两个树状数组A和B,1~x +v时A中x加上x*v,B中x加上x。

查询1~x时(A中1~x)+(B中x+1~n) *n。

那二维?

同理!开四个树状数组A,B,C,D。

修改(1,1)~(x,y)+v时

A中(x,y)+v*x*y

B中(x,y)+v*x

C中(x,y)+v*y

D中(x,y)+v

查询不写了,其实就是把行列看成点,和一维的差不多。

答案容斥一下,就做完了。

 

代码:

 

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 2250
int c[N][N][4],n,m;
char opt[10];
void fix(int x,int y,int v,int f) {
    int i,j;
    if(!x||!y) return ;
    for(i=x;i<=n;i+=i&(-i)) for(j=y;j<=m;j+=j&(-j)) c[i][j][f]+=v;
}
int inq(int x,int y,int f) {
    int re=0,i,j;
    for(i=x;i;i-=i&(-i)) for(j=y;j;j-=j&(-j)) re+=c[i][j][f];
    return re;
}
void add(int x,int y,int v) {
    fix(x,y,v*x*y,0); 
    fix(x,y,v*x,1); 
    fix(x,y,v*y,2); 
    fix(x,y,v,3);
}
int qsum(int x,int y) {
    return inq(x,y,0)+
    y*(inq(x,m,1)-inq(x,y,1))+
    x*(inq(n,y,2)-inq(x,y,2))+
    x*y*(inq(n,m,3)+inq(x,y,3)-inq(x,m,3)-inq(n,y,3));
}
int main() {
    scanf("%s%d%d",opt,&n,&m);
    int i,x2,y2,x3,y3,h;
    while(scanf("%s%d%d%d%d",opt,&x2,&y2,&x3,&y3)!=EOF) {
        if(opt[0]=='L') scanf("%d",&h),add(x2-1,y2-1,h),add(x2-1,y3,-h),add(x3,y2-1,-h),add(x3,y3,h);
        else printf("%d\n",qsum(x2-1,y2-1)-qsum(x2-1,y3)-qsum(x3,y2-1)+qsum(x3,y3));
    }
}

 

posted @ 2018-04-08 10:41  fcwww  阅读(208)  评论(0编辑  收藏  举报