首页 > 其他 > 详细

线段树+

时间:2021-04-15 15:23:36      阅读:33      评论:0      收藏:0      [点我收藏+]
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
int a[maxn<<4],lz[maxn];
void build(int k,int l,int r){
    if(l==r){
        cin>>a[k];return ;
    }
    int mid=l+r>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
    a[k]=a[k<<1]+a[k<<1|1];
}
void push_down(int k,int l,int r){
    if(lz[k]){
        lz[k<<1]+=lz[k];
        lz[k<<1|1]+=lz[k];
        int mid=l+r>>1;
        a[k<<1]+=1ll*(mid-l)*lz[k];
        a[k<<1|1]+=1ll*(r-mid+1)*lz[k];
        lz[k]=0;
    }
}
void updata(int k,int l,int r,int L,int R,int add){
    if(l<=L&&r>=R){
        a[k]+=(R-L+1)*add;
        lz[k]+=add;
        return ;
    }
    push_down(k,L,R);
    int mid=L+R>>1;
    if(l<=mid)
        updata(k<<1,l,r,L,mid,add);
    if(r>mid)
        updata(k<<1|1,l,r,mid+1,R,add);
    a[k]=a[k<<1]+a[k<<1|1];
}
ll query(int k,int l,int r,int L,int R){
    if(l<=L&&r>=R)return a[k];
    push_down(k,L,R);
    int mid=L+R>>1;
    ll sum=0;
    if(l<=mid)
        sum+=query(k<<1,l,r,L,mid);
    if(r>mid)
        sum+=query(k<<1|1,l,r,mid+1,R);
    return sum;
}
int main()
{
    int n,k;
    cin>>n>>k;build(1,1,n);
    while(k--){
        int q,l,r,add;cin>>q;
        if(q==1){//区间查询
            cin>>l>>r;
            cout<<query(1,l,r,1,n)<<endl;
        }
        else{//区间修改
            cin>>l>>r>>add;
            updata(1,l,r,1,n,add);
        }
    }
}

 

线段树+

原文:https://www.cnblogs.com/qq1415584788/p/14662080.html

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