50pts求助

P1253 扶苏的问题

Xuwindows_WS @ 2024-07-15 21:15:04

#include<bits/stdc++.h>
using namespace std;
long long a[1000010];
long long tr[4000040];
long long lza[4000040];
long long lzu[4000040];
bool vis[4000040];
void build(long long l,long long r,long long id)
{
    if(l==r)
    {
        tr[id]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,id*2);
    build(mid+1,r,id*2+1);
    tr[id]=max(tr[id*2],tr[id*2+1]);
}
void add(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
    if(lu<=ln&&ru>=rn)
    {
        tr[id]+=k;
        lza[id]+=k;
        return;
    }
    long long mid=(ln+rn)/2;
    if(lza[id]!=0&&ln!=rn)
    {
        tr[id*2]+=lza[id];
        tr[id*2+1]+=lza[id];
        lza[id*2]+=lza[id];
        lza[id*2+1]+=lza[id];
        lza[id]=0;
    }
    if(lu<=mid)add(lu,ru,ln,mid,id*2,k);
    if(ru>mid)add(lu,ru,mid+1,rn,id*2+1,k);
    tr[id]=max(tr[id*2],tr[id*2+1]);
}
void upd(long long lu,long long ru,long long ln,long long rn,long long id,long long k)
{
//  cout<<' '<<lu<<' '<<ru<<' '<<ln<<' '<<rn<<' '<<id<<' '<<k<<endl;
//  cout<<tr[id]<<' '<<lzu[id]<<endl;
    if(lu<=ln&&ru>=rn)
    {
        tr[id]=k;
        lzu[id]=k;
        vis[id]=false;
        return;
    }
    long long mid=(ln+rn)/2;
    if(!vis[id]&&ln!=rn)
    {
        tr[id*2]=lzu[id];
        tr[id*2+1]=lzu[id];
        lzu[id*2]=lzu[id];
        lzu[id*2+1]=lzu[id];
        lzu[id]=0;
        vis[id]=true;
    }
//  cout<<tr[id]<<' '<<lzu[id]<<endl;
    if(lu<=mid)upd(lu,ru,ln,mid,id*2,k);
//  cout<<tr[id]<<' '<<lzu[id]<<endl;
    if(ru>mid)upd(lu,ru,mid+1,rn,id*2+1,k);
//  cout<<tr[id]<<' '<<lzu[id]<<endl;
    tr[id]=max(tr[id*2],tr[id*2+1]);
//  cout<<tr[id]<<' '<<lzu[id]<<endl;
}
long long getmax(long long lc,long long rc,long long ln,long long rn,long long id)
{
    if(lc<=ln&&rc>=rn)
    {
        return tr[id];
    }
    long long mid=(ln+rn)/2;
    if(lza[id]!=0)
    {
        tr[id*2]+=lza[id];
        tr[id*2+1]+=lza[id];
        lza[id*2]+=lza[id];
        lza[id*2+1]+=lza[id];
        lza[id]=0;
    }
    if(lzu[id]!=0)
    {
        tr[id*2]=lzu[id];
        tr[id*2+1]=lzu[id];
        lzu[id*2]=lzu[id];
        lzu[id*2+1]=lzu[id];
        lzu[id]=0;
    }
    long long maxn=0;
    if(lc<=mid)maxn=max(getmax(lc,rc,ln,mid,id*2),maxn);
    if(rc>mid)maxn=max(getmax(lc,rc,mid+1,rn,id*2+1),maxn);
    return maxn;
}
int main()
{
    long long n,m;
    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++)
    {
        int op;
        scanf("%lld",&op);
        if(op==1)
        {
            long long x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            upd(x,y,1,n,1,k);
        }
        else if(op==2)
        {
            long long x,y,k;
            scanf("%lld%lld%lld",&x,&y,&k);
            add(x,y,1,n,1,k);
        }
        else if(op==3)
        {
            long long x,y;
            scanf("%lld%lld",&x,&y);
            cout<<getmax(x,y,1,n,1)<<endl;
        }
    }
    return 0;
}

by cyberlangke @ 2024-07-16 19:58:16

会不会是getmax函数的原因, 初始maxn为0的话, 如果孩子的最大值为负数是不是会错?


by Xuwindows_WS @ 2024-07-16 20:37:47

改成了-1e16-10还是错(记录) 不过还是谢谢你。(至少多得了10pts)


|