zoukankan      html  css  js  c++  java
  • BZOJ3132: 上帝造题的七分钟

    题解:多个树树状数组的妙用

    #include <bits/stdc++.h>
    //#define ll long long
    const int MAXN=2050;
    using namespace std;
    int a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN],d[MAXN][MAXN];
    int n,m;
    int get_id(int x){return x&(-x);}
    void add1(int x,int y,int vul){
        for(int i=x;i<=n;i+=get_id(i)){
    	for(int j=y;j<=m;j+=get_id(j))a[i][j]+=vul;
        }
    }
    void add2(int x,int y,int vul){
        for(int j=y;j<=m;j+=get_id(j)){
    	for(int i=x;i>0;i-=get_id(i))b[i][j]+=vul;
        }
    }
    void add3(int x,int y,int vul){
        for(int i=x;i<=n;i+=get_id(i)){
    	for(int j=y;j>0;j-=get_id(j))c[i][j]+=vul;
        }
    }
    void add4(int x,int y,int vul){
        for(int i=x;i>0;i-=get_id(i)){
    	for(int j=y;j>0;j-=get_id(j))d[i][j]+=vul;
        }
    }
    int querty1(int x,int y){
        int ans=0;
        for(int i=x;i>0;i-=get_id(i)){
    	for(int j=y;j>0;j-=get_id(j))ans+=a[i][j];
        }
        return ans;
    }
    int querty2(int x,int y){
        int ans=0;
        for(int i=x;i<=n;i+=get_id(i)){
    	for(int j=y;j>0;j-=get_id(j))ans+=b[i][j]*(x);
        }
        return ans;
    }
    int querty3(int x,int y){
        int ans=0;
        for(int j=y;j<=m;j+=get_id(j)){
    	for(int i=x;i>0;i-=get_id(i))ans+=c[i][j]*(y);
        }
        return ans;
    }
    int querty4(int x,int y){
        int ans=0;
        for(int i=x;i<=n;i+=get_id(i)){
    	for(int j=y;j<=m;j+=get_id(j))ans+=d[i][j];
        }
        return ans;
    }
    char str[11];
    int h[5];
    void update(int x,int y,int vul){
        add1(x+1,y+1,x*y*vul);
        add2(x,y+1,y*vul);
        add3(x+1,y,x*vul);
        add4(x,y,vul);
    }
    int Sum(int x,int y){
        int res=0;
        res+=querty1(x,y);
       // cout<<"res== "<<" "<<res<<endl;
        res+=querty2(x,y);
       // cout<<"res= "<<res<<endl;
        res+=querty3(x,y);
       // cout<<"res= "<<res<<endl;
        res+=querty4(x,y)*x*y;
        return res;
    }
    int main(){
        scanf(" %s%d%d",str,&n,&m);n++;m++;
        int vul;
        while(scanf(" %s",str)!=EOF){
    	for(int i=1;i<=4;i++)scanf("%d",&h[i]),h[i]++;
    	if(str[0]=='L'){
    	    scanf("%d",&vul);
    	    update(h[3],h[4],vul);
    	   // cout<<Sum(2,2)<<"::::"<<" "<<vul<<endl;
    	    update(h[1]-1,h[2]-1,vul);
    	   // cout<<"左下角:::  "<<" "<<Sum(2,2)<<endl;
    	    update(h[1]-1,h[4],-1*vul);
    	  //  cout<<"左上角:: "<<Sum(2,2)<<endl;
    	    update(h[3],h[2]-1,-1*vul);
    	   // cout<<Sum(2,2)<<endl;
    	}
    	else if(str[0]=='k'){
    	    printf("%d
    ",Sum(h[3],h[4])-Sum(h[1]-1,h[4])-Sum(h[3],h[2]-1)+Sum(h[1]-1,h[2]-1));
    	}
    //	cout<<Sum(4,2)<<endl;
    //	cout<<querty2(4,2)<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    外贸邮箱哪个是安全邮箱?申请163电子邮箱可以吗?
    申请163电子邮箱,163邮箱格式是么样的?
    传统小游戏是否已过时?经典案例告诉你
    超越前作,H5游戏微创新是王道
    163邮箱哪个安全好用?常用的电子邮箱品牌有哪些?
    开通企业邮箱多少钱?企业邮箱怎么注册申请?
    如何保护电子邮箱安全?163邮箱安全吗?
    外贸邮箱怎么注册?集团公司企业邮箱哪个更适合?
    NBA战火重燃,H5游戏带你重拾青春回忆
    H5游戏定制选题知多少
  • 原文地址:https://www.cnblogs.com/wang9897/p/9360323.html
Copyright © 2011-2022 走看看