这个思路很巧妙啊 ~ 

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;
}

  

12-24 19:06
查看更多