悬关50分求调

P1253 扶苏的问题

zhyn @ 2024-08-12 09:15:51

样例已过,但后5个点全WA,每次到输出负数的时候输出0,不知道怎么错了。

#include<bits/stdc++.h>
#define ll long long
#define maxn 1000005
#define inf LONG_LONG_MAX
using namespace std;

ll n,q;
ll num[maxn],w[4*maxn],lzy_set[4*maxn],lzy_add[4*maxn];

void pushup(ll u){
    w[u]=max(w[u*2],w[u*2+1]);
}

void build(ll u,ll l,ll r){      //建树 
    lzy_set[u]=inf;
    if(l==r){
        w[u]=num[l];
        return;
    }
    ll mid=(l+r)/2;
    build(u*2,l,mid);
    build(u*2+1,mid+1,r);
    pushup(u);
}

void maketag(ll u,ll k,ll type){       //标记延迟标记 
    if(type==1){
        lzy_add[u]=0;
        lzy_set[u]=k;
        w[u]=k;
    }
    else{
        if(lzy_set[u]==inf){
            lzy_add[u]+=k;
        }
        else{
            lzy_set[u]+=k;
        }
        w[u]+=k;
    }
}

void pushdown(ll u){
    if(lzy_set[u]==inf){
        maketag(u*2,lzy_add[u],2);
        maketag(u*2+1,lzy_add[u],2);
        lzy_add[u]=0;
    }
    else{
        maketag(u*2,lzy_set[u],1);
        maketag(u*2+1,lzy_set[u],1);
        lzy_set[u]=inf;
    }
}

void update(ll u,ll l,ll r,ll ql,ll qr,ll k,ll type){
    if(type==1){
        if(ql<=l&&r<=qr){            //完全包含 
            maketag(u,k,1);
        }
        else if(!((l>qr)||(r<ql))){         //不完全包含 
            ll mid=(l+r)/2;
            pushdown(u);
            update(u*2,l,mid,ql,qr,k,1);
            update(u*2+1,mid+1,r,ql,qr,k,1);
            pushup(u);
        }
    }
    else{
        if(ql<=l&&r<=qr){            //完全包含 
            maketag(u,k,2);
        }
        else if(!((l>qr)||(r<ql))){         //不完全包含 
            ll mid=(l+r)/2;
            pushdown(u);
            update(u*2,l,mid,ql,qr,k,2);
            update(u*2+1,mid+1,r,ql,qr,k,2);
            pushup(u);
        }
    }
}

ll query(ll u,ll l,ll r,ll ql,ll qr){
    if(ql<=l&&r<=qr){
        return w[u];
    }
    else if((l>qr)||(r<ql)){       //无交接 
        return 0;
    }
    else{
        ll mid=(l+r)/2;
        pushdown(u);
        ll sum=max(query(u*2,l,mid,ql,qr),query(u*2+1,mid+1,r,ql,qr));
        return sum;
    }
}

int main(){
    //cout<<inf<<"\n";
    scanf("%lld%lld",&n,&q);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&num[i]);
    }

    build(1,1,n);

    for(ll i=1;i<=q;i++){
        ll op,x,y;
        ll k;
        scanf("%lld",&op);
        if(op==1){
            scanf("%lld%lld%lld",&x,&y,&k);
            update(1,1,n,x,y,k,1);
        }
        else if(op==2){
            scanf("%lld%lld%lld",&x,&y,&k);
            update(1,1,n,x,y,k,2);
        }
        else{
            scanf("%lld%lld",&x,&y);
            ll sum=query(1,1,n,x,y);
            printf("%lld\n",sum);
        }
    }

    return 0;
}

测评


by imfbust @ 2024-08-16 21:01:45

@zhyn ,在你那个query函数中若无交接需返回-inf,不然返回0就都比其他数大了


by zhyn @ 2024-08-16 21:43:52

@imfbust ,谢谢,原来是这里错了。还是太弱了。。已AC。已关。


|