救救孩子吧!60pts WA on#7 #8 #9 TLE on#10

P1253 扶苏的问题

LDY_ @ 2024-07-21 12:22:53

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f3f3f3f3f
#define int long long
using namespace std;
int n,q;
int a[2000005];
struct Tree{
    int l,r,siz;
    int ad,cov;
    int maxx;
}t[8000005];
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
void pushup(int x){
    t[x].maxx=max(t[ls(x)].maxx,t[rs(x)].maxx);
}
void build(int x,int l,int r){
    t[x].l=l;t[x].r=r;t[x].siz=r-l+1;
    t[x].ad=0;t[x].cov=-inf;
    if(l==r){
        t[x].maxx=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(ls(x),l,mid);
    build(rs(x),mid+1,r);
    pushup(x);
}
void pushdown(int x){
    if(t[x].cov!=-inf){
        t[ls(x)].cov=t[x].cov;
        t[rs(x)].cov=t[x].cov;
        t[ls(x)].ad=t[x].ad;
        t[rs(x)].ad=t[x].ad;
        t[ls(x)].maxx=t[x].ad+t[x].cov;
        t[ls(x)].maxx=t[x].ad+t[x].cov;
    }
    else{
        t[ls(x)].ad+=t[x].ad;
        t[rs(x)].ad+=t[x].ad;
        t[ls(x)].maxx+=t[x].ad;
        t[rs(x)].maxx+=t[x].ad;
    }

    t[x].cov=-inf;t[x].ad=0;
}
void add(int x,int ll,int rr,int k){
    if(t[x].l>rr||t[x].r<ll) return;
    if(t[x].l>=ll&&t[x].r<=rr){
        t[x].ad+=k;
        t[x].maxx+=k;
        return;
    }
    pushdown(x);
    add(ls(x),ll,rr,k);
    add(rs(x),ll,rr,k);
    pushup(x);
}
void cover(int x,int ll,int rr,int k){
    if(t[x].l>rr||t[x].r<ll) return;
    if(t[x].l>=ll&&t[x].r<=rr){
        t[x].ad=0;
        t[x].cov=k;
        t[x].maxx=k;
        return;
    }
    pushdown(x);
    cover(ls(x),ll,rr,k);
    cover(rs(x),ll,rr,k);
    pushup(x);
}
int query(int x,int ll,int rr){
    if(t[x].l>rr||t[x].r<ll) return -inf;
    if(t[x].l>=ll&&t[x].r<=rr) return t[x].maxx;
    pushdown(x);
    return max(query(ls(x),ll,rr),query(rs(x),ll,rr));
}
signed main(){
    scanf("%lld%lld",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    int opt,l,r,x;
    while(q--){
        scanf("%lld",&opt);
        if(opt==1){
            scanf("%lld%lld%lld",&l,&r,&x);
            cover(1,l,r,x);
        }
        if(opt==2){
            scanf("%lld%lld%lld",&l,&r,&x);
            add(1,l,r,x);
        }
        if(opt==3){
            scanf("%lld%lld",&l,&r);
            cout<<query(1,l,r)<<endl;
        }
    }
    return 0;
}

by dci66666 @ 2024-07-22 20:23:09

巧了,这题我也没过(


by ZZ_WYZ @ 2024-11-28 21:34:38

%%%


|