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

  

posted @ 2019-12-19 20:48  EM-LGH  阅读(150)  评论(0编辑  收藏  举报