046.线段树模板

模板

luogu P3372

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e5+5;

ll a[N];
ll sum[N<<2];
ll add[N<<2];
ll cha[N<<2];
bool need[N<<2];
void up(int x){
    sum[x]=sum[x<<1]+sum[x<<1|1];
}
void built(int x,int l,int r){
    if(l==r){
        sum[x]=a[l];
    }
    else{
        int mid=(l+r)>>1;
        built(x<<1,l,mid);
        built(x<<1|1,mid+1,r);
        up(x);
    }
    add[x]=0;
    need[x]=0;
}
void lazy_add(int x,ll k,int siz){
    sum[x]+=k*siz;
    add[x]+=k;
}
void lazy_change(int x,ll k,int siz){
    add[x]=0;
    sum[x]=k*siz;
    need[x]=1;
    cha[x]=k;
}
void down(int x,int ln,int rn){
    if(need[x]){
        lazy_change(x<<1,cha[x],ln);
        lazy_change(x<<1|1,cha[x],rn);
        need[x]=0;
    }
    if(add[x]){
        lazy_add(x<<1,add[x],ln);
        lazy_add(x<<1|1,add[x],rn);
        add[x]=0;
    }
}
ll query(int x,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return sum[x];
    int mid=(l+r)>>1;
    down(x,mid-l+1,r-mid);
    ll ans=0;
    if(ql<=mid)ans+=query(x<<1,l,mid,ql,qr);
    if(qr>mid)ans+=query(x<<1|1,mid+1,r,ql,qr);
    return ans;
}
void change(int x,int l,int r,int ql,int qr,ll k){
    if(ql<=l&&r<=qr){
        lazy_change(x,k,r-l+1);
        return;
    }
    int mid=(l+r)>>1;
    down(x,mid-l+1,r-mid);
    if(ql<=mid)change(x<<1,l,mid,ql,qr,k);
    if(qr>mid)change(x<<1|1,mid+1,r,ql,qr,k);
    up(x);
}
void ADD(int x,int l,int r,int ql,int qr,ll k){
    if(ql<=l&&r<=qr){
        lazy_add(x,k,r-l+1);
        return;
    }
    int mid=(l+r)>>1;
    down(x,mid-l+1,r-mid);
    if(ql<=mid)ADD(x<<1,l,mid,ql,qr,k);
    if(qr>mid)ADD(x<<1|1,mid+1,r,ql,qr,k);
    up(x);
}
void solve(){
    int n,m,op,l,r;
    ll k;
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i];
    built(1,1,n);
    while(m--){
        cin>>op;
        if(op==1){
            cin>>l>>r>>k;
            ADD(1,1,n,l,r,k);
        }
        if(op==2){
            cin>>l>>r;
            cout<<query(1,1,n,l,r)<<'\n';
        }
    } 
}
int main(void){
    cin.tie(0)->sync_with_stdio(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
}

luogu P1253

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=1e6+5;

ll a[N];
ll Max[N<<2];
ll add[N<<2];
ll cha[N<<2];
bool need[N<<2];
void up(int x){
    Max[x]=max(Max[x<<1],Max[x<<1|1]);
}
void built(int x,int l,int r){
    if(l==r){
        Max[x]=a[l];
    }
    else{
        int mid=(l+r)>>1;
        built(x<<1,l,mid);
        built(x<<1|1,mid+1,r);
        up(x);
    }
    add[x]=0;
    need[x]=0;
}
void lazy_add(int x,ll k){
    Max[x]+=k;
    add[x]+=k;
}
void lazy_change(int x,ll k){
    add[x]=0;
    Max[x]=k;
    need[x]=1;
    cha[x]=k;
}
void down(int x){
    if(need[x]){
        lazy_change(x<<1,cha[x]);
        lazy_change(x<<1|1,cha[x]);
        need[x]=0;
    }
    if(add[x]){
        lazy_add(x<<1,add[x]);
        lazy_add(x<<1|1,add[x]);
        add[x]=0;
    }
}
ll query(int x,int l,int r,int ql,int qr){
    if(ql<=l&&r<=qr)return Max[x];
    int mid=(l+r)>>1;
    down(x);
    ll ans=LONG_LONG_MIN;
    if(ql<=mid)ans=max(ans,query(x<<1,l,mid,ql,qr));
    if(qr>mid)ans=max(ans,query(x<<1|1,mid+1,r,ql,qr));
    return ans;
}
void change(int x,int l,int r,int ql,int qr,ll k){
    if(ql<=l&&r<=qr){
        lazy_change(x,k);
        return;
    }
    int mid=(l+r)>>1;
    down(x);
    if(ql<=mid)change(x<<1,l,mid,ql,qr,k);
    if(qr>mid)change(x<<1|1,mid+1,r,ql,qr,k);
    up(x);
}
void ADD(int x,int l,int r,int ql,int qr,ll k){
    if(ql<=l&&r<=qr){
        lazy_add(x,k);
        return;
    }
    int mid=(l+r)>>1;
    down(x);
    if(ql<=mid)ADD(x<<1,l,mid,ql,qr,k);
    if(qr>mid)ADD(x<<1|1,mid+1,r,ql,qr,k);
    up(x);
}
void solve(){
    int n,m,op,l,r;
    ll k;
    cin>>n>>m;
    for(int i=1;i<=n;++i)cin>>a[i];
    built(1,1,n);
    while(m--){
        cin>>op;
        if(op==1){
            cin>>l>>r>>k;
            change(1,1,n,l,r,k);
        }
        if(op==2){
            cin>>l>>r>>k;
            ADD(1,1,n,l,r,k);
        }
        if(op==3){
            cin>>l>>r;
            cout<<query(1,1,n,l,r)<<'\n';
        }
    } 
}
int main(void){
    cin.tie(0)->sync_with_stdio(0);
    int T=1;
    //cin>>T;
    while(T--)solve();
}
posted @ 2026-01-16 01:24  射杀百头  阅读(2)  评论(0)    收藏  举报