P1253 求助!
  • 板块学术版
  • 楼主lijunxi_luqiao
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/13 15:48
  • 上次更新2024/8/13 17:22:06
查看原帖
P1253 求助!
1006406
lijunxi_luqiao楼主2024/8/13 15:48

本人蒟蒻
不知为何,本题WA 20%测试点

本人代码如下:

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[1000005],maxn[4000005],add[4000005][2];
void pushup(long long rt)
{
    maxn[rt]=max(maxn[rt<<1],maxn[rt<<1|1]);
}
void pushdown(long long rt,long long len)
{
    if(add[rt][0])
    {
        maxn[rt<<1]=maxn[rt<<1|1]=add[rt][0],
        add[rt<<1][0]=add[rt<<1|1][0]=add[rt][0];
        add[rt][0]=0;
    }
    if(add[rt][1])
    {
        maxn[rt<<1]+=add[rt][1],maxn[rt<<1|1]+=add[rt][1],
        add[rt<<1][1]=add[rt<<1|1][1]=add[rt][1];
        add[rt][1]=0;
    }
}
void build(long long l,long long r,long long rt)
{
    if(l==r)
    {
        maxn[rt]=a[l];
        return ;
    }
    long long mid=l+r>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    pushup(rt);
}
void update1(long long ul,long long ur,long long nv,long long l,long long r,long long rt)
{
    if(ul<=l&&ur>=r)
    {
        if(l!=r)
            pushdown(rt,r-l+1);
        maxn[rt]=nv,add[rt][0]=nv;
        return ;
    }
    long long mid=l+r>>1;
    pushdown(rt,r-l+1);
    if(ul<=mid)
        update1(ul,ur,nv,l,mid,rt<<1);
    if(ur>mid)
        update1(ul,ur,nv,mid+1,r,rt<<1|1);
    pushup(rt);
}
void update2(long long ul,long long ur,long long nv,long long l,long long r,long long rt)
{
    if(ul<=l&&ur>=r)
    {
        if(l!=r)
            pushdown(rt,r-l+1);
        maxn[rt]+=nv,add[rt][1]+=nv;
        return ;
    }
    long long mid=l+r>>1;
    pushdown(rt,r-l+1);
    if(ul<=mid)
        update2(ul,ur,nv,l,mid,rt<<1);
    if(ur>mid)
        update2(ul,ur,nv,mid+1,r,rt<<1|1);
    pushup(rt);
}
long long query(long long ql,long long qr,long long l,long long r,long long rt)
{
    if(ql<=l&&qr>=r)
        return maxn[rt];
    long long mid=l+r>>1,cnt=LLONG_MIN;
    pushdown(rt,r-l+1);
    if(ql<=mid)
        cnt=max(query(ql,qr,l,mid,rt<<1),cnt);
    if(qr>mid)
        cnt=max(query(ql,qr,mid+1,r,rt<<1|1),cnt);
    return cnt;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    build(1,n,1);
    for(long long i=1;i<=m;i++)
    {
        long long op,x,y,z;
        cin>>op>>x>>y;
        switch(op)
        {
            case 1:scanf("%lld",&z);update1(x,y,z,1,n,1);break;
            case 2:scanf("%lld",&z);update2(x,y,z,1,n,1);break;
            case 3:printf("%lld\n",query(x,y,1,n,1));
        }
    }
    return 0;
}

望相助!

2024/8/13 15:48
加载中...