首页 > 编程语言 > 详细

AcWing 243. 一个简单的整数问题2 (树状数组,区间更新/询问)

时间:2020-11-16 22:39:38      阅读:39      评论:0      收藏:0      [点我收藏+]

技术分享图片

  • 题意:区间更新,区间询问.

  • 题解;对于区间更新,我们还是用差分数组\(b_i\)来更新,区间询问时,我们的答案是:\(\sum_{i=l}^{r}\sum_{j=1}^{i}b_j\),

    技术分享图片

    所以,我们搞两个树状数组维护\(b_i\)\(i*b_i\)即可.

  • 代码:

    #define int long long 
    
    int n,m;
    int a[N];
    int c1[N],c2[N];
    
    int lowbit(int x){
        return x&(-x);
    }
    
    void updata1(int i,int k){
        while(i<=n){
            c1[i]+=k;
            i+=lowbit(i);
        }
    }
    
    void updata2(int i,int k){
        while(i<=n){
            c2[i]+=k;
            i+=lowbit(i);
        }
    }
    
    int get_sum1(int i){
        int res=0;
        while(i){
            res+=c1[i];
            i-=lowbit(i);
        }
        return res;
    }
    
    int get_sum2(int i){
        int res=0;
        while(i){
            res+=c2[i];
            i-=lowbit(i);
        }
        return res;
    }
    
    signed main() {
        ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
        cin>>n>>m;
    
        rep(i,1,n){
            cin>>a[i];
            updata1(i,a[i]-a[i-1]);
            updata2(i,i*(a[i]-a[i-1]));
        }
    
        rep(i,1,m){
            char op;
            cin>>op;
            if(op==‘Q‘){
                int l,r;
                cin>>l>>r;
                int cur1=get_sum1(r)*(r+1)-get_sum2(r);
                int cur2=get_sum1(l-1)*l-get_sum2(l-1);
                cout<<cur1-cur2<<‘\n‘;
            }
            else{
                int l,r,d;
                cin>>l>>r>>d;
                updata1(l,d);
                updata2(l,l*d);
                updata1(r+1,-d);
                updata2(r+1,(r+1)*-d);
            }
        }
    
     
        return 0;
    }
    

AcWing 243. 一个简单的整数问题2 (树状数组,区间更新/询问)

原文:https://www.cnblogs.com/lr599909928/p/13991482.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!