WA 线段树 60 分,求条

P1253 扶苏的问题

wptt @ 2024-03-22 20:55:08

#include<iostream>
#include<vector>
#define int long long
using namespace std;
const int N=1e6+5,inf=1e18;
int n,m,a[N],s[N<<2],add[N<<2],lazy[N<<2];
void pushdown(int k,int l,int r){
    int mid=(l+r)/2;
    if(lazy[k]!=inf){
        s[k*2]=lazy[k];
        s[k*2+1]=lazy[k];

        lazy[k*2]=lazy[k];
        lazy[k*2+1]=lazy[k*2+1];

        add[k*2]=add[k*2+1]=0;
    }
    if(add[k]){
        s[k*2]+=add[k];
        s[k*2+1]+=add[k];

        add[k*2]+=add[k];
        add[k*2+1]+=add[k];

        add[k]=0;
    }
}
void build(int k,int l,int r){
    lazy[k]=inf;
    if(l==r){
        s[k]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    s[k]=max(s[k*2],s[k*2+1]);
}
void change1(int k,int l,int r,int x,int y,int v){
    if(l>y||r<x){
        return;
    }
    if(x<=l&&r<=y){
        s[k]=v;
        add[k]=0;
        lazy[k]=v;
        return;
    }
    pushdown(k,l,r);
    int mid=(l+r)/2;
    change1(k*2,l,mid,x,y,v);
    change1(k*2+1,mid+1,r,x,y,v);
    s[k]=max(s[k*2],s[k*2+1]);
}
void change2(int k,int l,int r,int x,int y,int v){
    if(l>y||r<x){
        return;
    }
    if(x<=l&&r<=y){
        s[k]+=v;
        add[k]+=v;
        return;
    }
    pushdown(k,l,r);
    int mid=(l+r)/2;
    change2(k*2,l,mid,x,y,v);
    change2(k*2+1,mid+1,r,x,y,v);
    s[k]=max(s[k*2],s[k*2+1]);
}
int ask(int k,int l,int r,int x,int y){
    if(l>y||r<x){
        return -inf;
    }
    if(x<=l&&r<=y){
        return s[k];
    }
    pushdown(k,l,r);
    int mid=(l+r)/2;
    return max(ask(k*2,l,mid,x,y),ask(k*2+1,mid+1,r,x,y));
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1,op,l,r,k;i<=m;i++){
        cin>>op>>l>>r;
        if(op==3){
            cout<<ask(1,1,n,l,r)<<'\n';
            continue;
        }
        cin>>k;
        if(op==1){
            change1(1,1,n,l,r,k);
        }
        else{
            change2(1,1,n,l,r,k);
        }
    }

    return 0;
}

by Usada_Pekora @ 2024-03-22 21:00:34

@zask

void pushdown(int k,int l,int r){
    int mid=(l+r)/2;
    if(lazy[k]!=inf){
        s[k*2]=lazy[k];
        s[k*2+1]=lazy[k];

        lazy[k*2]=lazy[k];
        lazy[k*2+1]=lazy[k]; // 1

        add[k*2]=add[k*2+1]=0;
     lazy[k] = inf; // 2
    }
    if(add[k]){
        s[k*2]+=add[k];
        s[k*2+1]+=add[k];

        add[k*2]+=add[k];
        add[k*2+1]+=add[k];

        add[k]=0;
    }
}

by do_it_tomorrow @ 2024-03-22 21:01:40

@Usada_Pekora %%%


by wptt @ 2024-03-22 21:02:51

@do_it_tomorrow @Usada_Pekora %%%


|