BZOJ 3132: 上帝造题的七分钟 树状数组+差分
这个思路很巧妙啊 ~
code:
#include <cstdio> #include <algorithm> #define N 2050 #define ll int #define setIO(s) freopen(s".in","r",stdin) using namespace std; struct BIT { ll C[N][N]; int lowbit(int t) { return t&(-t); } void update(int x,int y,int d) { for(int i=x;i<N;i+=lowbit(i)) { for(int j=y;j<N;j+=lowbit(j)) { C[i][j]+=d; } } } ll query(int x,int y) { ll re=0; for(int i=x;i;i-=lowbit(i)) { for(int j=y;j;j-=lowbit(j)) { re+=C[i][j]; } } return re; } }A,B,C,D; void Add(int x,int y,int d) { A.update(x,y,d); B.update(x,y,x*d); C.update(x,y,y*d); D.update(x,y,x*y*d); } ll qu(int x,int y) { ll qa=A.query(x,y)*(x*y+x+y+1); ll qb=-B.query(x,y)*(y+1); ll qc=-C.query(x,y)*(x+1); ll qd=D.query(x,y); return qa+qb+qc+qd; } int main() { // setIO("input"); char sr[2]; int i,j; int n; int m; scanf("%s",sr); scanf("%d%d",&n,&m); while(scanf("%s",sr)!=EOF) { int a,b,c,d,e; if(sr[0]=='L') { scanf("%d%d%d%d%d",&a,&b,&c,&d,&e); Add(a,b,e); Add(a,d+1,-e); Add(c+1,b,-e); Add(c+1,d+1,e); } else { scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",qu(c,d)-qu(a-1,d)-qu(c,b-1)+qu(a-1,b-1)); } } return 0; }