90求助,最后一个WA,悬赏关注一个

P1253 扶苏的问题

Blue_Flower @ 2023-02-25 19:53:20

#include<bits/stdc++.h>
#define MAXN 1000010
#define ll long long
using namespace std;
ll n,q,w[MAXN*4],lzya[MAXN*4],lzy[MAXN*4],inf;
ll _max(ll a,ll b)
{
    return a>b ? a:b;
}
void build(ll u,ll l,ll r)
{
    if(l==r)
    {
        scanf("%lld",&w[u]);return;
    }
    ll mid=(l+r)/2;
    build(u*2,l,mid);build(u*2+1,mid+1,r);
    w[u]=_max(w[u*2],w[u*2+1]);
    return;
}
void pushdown(ll u)
{
    if(lzy[u]!=inf)
    {
        w[u]=lzy[u];
        lzya[u*2]=lzya[u*2+1]=0;
        lzy[u*2]=lzy[u*2+1]=lzy[u];
    }
    lzy[u]=inf;
    w[u]+=lzya[u];
    lzya[u*2]+=lzya[u];lzya[u*2+1]+=lzya[u];
    lzya[u]=0;
    return;
}
inline bool in(ll l1,ll r1,ll l2,ll r2)
{
    return l1>=l2&&r1<=r2;
}
inline bool out(ll l1,ll r1,ll l2,ll r2)
{
    return r1<l2||l1>r2;
}
void change(ll u,ll l,ll r,ll x,ll y,ll k)
{
    pushdown(u);
    if(in(l,r,x,y))
    {
        lzy[u]=k;pushdown(u);
        return;
    }
    if(!out(l,r,x,y))
    {
        int mid=(l+r)/2;
        change(u*2,l,mid,x,y,k);change(u*2+1,mid+1,r,x,y,k);
        w[u]=_max(w[u*2],w[u*2+1]);
    }
    return;
}
void add(ll u,ll l,ll r,ll x,ll y,ll k)
{
    pushdown(u);
    if(in(l,r,x,y))
    {
        lzya[u]=k;pushdown(u);
        return;
    }
    if(!out(l,r,x,y))
    {
        int mid=(l+r)/2;
        add(u*2,l,mid,x,y,k);add(u*2+1,mid+1,r,x,y,k);
        w[u]=_max(w[u*2],w[u*2+1]);
    }
    return;
}
ll find(ll u,ll l,ll r,ll x,ll y)
{
    pushdown(u);
    if(in(l,r,x,y)) return w[u];
    if(!out(l,r,x,y))
    {
        int mid=(l+r)/2;
        if(out(l,mid,x,y)) return find(u*2+1,mid+1,r,x,y);
        else if(out(mid+1,r,x,y)) return find(u*2,l,mid,x,y);
        else return _max(find(u*2,l,mid,x,y),find(u*2+1,mid+1,r,x,y));
    }
}
int main()
{
    memset(lzy,0x3f3f3f,sizeof(lzy));inf=lzy[0];
    scanf("%d%d",&n,&q);
    build(1,1,n);
    ll op,l,r,x;
    while(q--)
    {
        scanf("%d%d%d",&op,&l,&r);
        switch(op)
        {
            case 1: scanf("%lld",&x);change(1,1,n,l,r,x);break;
            case 2: scanf("%lld",&x);add(1,1,n,l,r,x);break;
            default: printf("%lld\n",find(1,1,n,l,r));
        }
    }
    return 0;
}

by Blue_Flower @ 2023-02-25 19:55:11

想了很多,后来给int全改long long,还是没过,以为会不会max爆炸了,还手写了一个


|