10分求调

P1253 扶苏的问题

Elysialr @ 2024-10-15 12:51:34

#include<bits/stdc++.h>
using namespace std;
#define x_lc (x<<1)
#define x_rc (x<<1|1)
#define x_mid ((t[x].l+t[x].r)>>1)
#define inf -(1<<30)

struct SegmentTree{
    long long l,r;
    long long data;
    long long add,give;
    long long leng(){
        return r-l+1;
    }
};

long long a[1000001];
SegmentTree t[4000001];

void build(long long x,long long l,long long r){
    t[x].l=l;
    t[x].r=r;
    t[x].add=0;
    t[x].give=inf;
    if(l==r){
        t[x].data=a[l];
        return;
    }
    build(x_lc,l,x_mid);
    build(x_rc,x_mid+1,r);
    t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void spread(long long x){
    if(t[x].give!=inf){
        t[x_lc].give=t[x].give;
        t[x_rc].give=t[x].give;
        t[x_lc].data=t[x].give;
        t[x_rc].data=t[x].give;
        t[x_lc].add=0;
        t[x_rc].add=0;
        t[x].give=0;
        t[x].add=0;
    }
    else{
        t[x_lc].add+=t[x].add;
        t[x_rc].add+=t[x].add;
        t[x_lc].data+=t[x].add;
        t[x_rc].data+=t[x].add;
        t[x].add=0;
    }
}
long long finds(long long x,long long l,long long r){
    if(t[x].l>=l&&t[x].r<=r) return t[x].data;
    spread(x);
    long long res=0;
    if(x_mid>=l) res=max(res,finds(x_lc,l,r));
    if(x_mid+1<=r) res=max(res,finds(x_rc,l,r));
    return res;
}
void adds(long long x,long long l,long long r,long long y){
    if(t[x].l>=l&&t[x].r<=r){
        if(t[x].give!=inf) t[x].give+=y;
        else t[x].add+=y;
        t[x].data+=y;
        return;
    }
    spread(x);
    if(x_mid>=l) adds(x_lc,l,r,y);
    if(x_mid+1<=r) adds(x_rc,l,r,y);
    t[x].data=max(t[x_lc].data,t[x_rc].data);
}
void change(long long x,long long l,long long r,long long y){
    if(t[x].l>=l&&t[x].r<=r){
        t[x].add=0;
        t[x].give=y;
        t[x].data=y;
        return;
    }
    spread(x);
    if(x_mid>=l) change(x_lc,l,r,y);
    if(x_mid+1<=r) change(x_rc,l,r,y);
    t[x].data=max(t[x_lc].data,t[x_rc].data);
}
int main(){
    long long n,m;
    cin>>n>>m;
    for(long long i=1;i<=n;i++) 
    cin>>a[i];

    build(1,1,n);
    for(long long i=1;i<=m;i++){
        long long k,l,r;
        cin>>k>>l>>r;
        if(k==3) cout<<finds(1,l,r)<<endl;
        else{
            long long x;
            cin>>x;
            if(k==1) adds(1,l,r,x);
            if(k==2) change(1,l,r,x);
        }
    }
    return 0;
}

by nnn233 @ 2024-10-15 13:13:50

@Elysialr 加标记下传时如果孩子的赋值标记不为inf要给孩子的赋值标记也加上


by nnn233 @ 2024-10-15 13:17:37

@Elysialr 赋值标记清空应该是设成inf


by nnn233 @ 2024-10-15 14:13:25

@Elysialr

void spread(long long x){
    if(t[x].give!=inf){
        t[x_lc].give=t[x].give;
        t[x_rc].give=t[x].give;
        t[x_lc].data=t[x].give;
        t[x_rc].data=t[x].give;
        t[x_lc].add=0;
        t[x_rc].add=0;
        t[x].give=inf;
        t[x].add=0;
    }
    else{
        if(t[x_lc].give!=inf)t[x_lc].give+=t[x].add;
        else t[x_lc].add+=t[x].add;
        if(t[x_rc].give!=inf)t[x_rc].give+=t[x].add;
        else t[x_rc].add+=t[x].add;
        t[x_lc].data+=t[x].add;
        t[x_rc].data+=t[x].add;
        t[x].add=0;
    }
}

by Elysialr @ 2024-10-15 14:35:18

@nnn233 谢谢已A


|