蒟蒻求助,只过了前5个点

P1253 扶苏的问题

b1468821672 @ 2022-11-24 16:08:06

#include<iostream>
using namespace std;
const int MAXN=1e6+10;
const int INF=1e10+10;
int n,m;
int a[MAXN];
struct tree
{
    int l,r;
    long long add;
    long long maxn,v;
}t[MAXN<<4];
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
inline void build(int i,int l,int r)
{
    t[i].l=l,t[i].r=r;
    t[i].v=INF;
    if(l==r)
    {
        t[i].maxn=a[l];
        return;
    }
    int mid=l+r>>1;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void push_down(int i)
{
    if(t[i].v!=INF)
    {
        t[i*2].maxn=t[i].v+t[i].add;
        t[i*2+1].maxn=t[i].v+t[i].add;
        t[i*2].v=t[i].v;
        t[i*2+1].v=t[i].v;
        t[i*2].add=t[i].add;
        t[i*2+1].add=t[i].add;
        t[i].add=0;
        t[i].v=INF;
    }
    if(t[i].add)
    {
        t[i*2].maxn+=t[i].add;
        t[i*2+1].maxn+=t[i].add;
        t[i*2].add+=t[i].add;
        t[i*2+1].add+=t[i].add;
        t[i].add=0;
    }
}
inline void add(int i,int l,int r,long long w)
{
    if(t[i].l>=l&&t[i].r<=r)
    {
        t[i].add+=w;
        t[i].maxn+=w;
        return;
    }
    push_down(i);
    int mid=t[i].l+t[i].r>>1;
    if(l<=mid)add(i*2,l,r,w);
    if(r>mid)add(i*2+1,l,r,w);
    t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline void change(int i,int l,int r,long long w)
{
    if(t[i].l>=l&&t[i].r<=r)
    {
        t[i].v=w;
        t[i].add=0;
        t[i].maxn=w;
        return;
 }
    push_down(i);
    int mid=t[i].l+t[i].r>>1;
    if(l<=mid)change(i*2,l,r,w);
    if(r>mid)change(i*2+1,l,r,w);
    t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
}
inline long long query(int i,int l,int r)
{
    if(t[i].l>=l&&t[i].r<=r)return t[i].maxn;
    push_down(i);
    int mid=t[i].l+t[i].r>>1;
    long long ans=0;
    if(l<=mid)ans=query(i*2,l,r);
    if(r>mid)ans=max(query(i*2+1,l,r),ans);
//  t[i].maxn=max(t[i*2].maxn,t[i*2+1].maxn);
    return ans;
}
signed main()
{
    n=read(),m=read();
    for(int i=1;i<=n;++i)cin>>a[i];
    build(1,1,n);
//  cout<<query(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int op=read(),l=read(),r=read(),x=0;
        if(op==1)
        {
            x=read();
            change(1,l,r,x);
        }
        if(op==2)
        {
            x=read();
            add(1,l,r,x);
        }
        if(op==3)
        {
            cout<<query(1,l,r)<<endl; 
        }
    }
}

by 02Ljh @ 2022-12-01 19:14:55

@b1468821672 INF不够大 建议0x3f3f3f3f 然后你就能获得60pts的好成绩了


by Z_X_D_ @ 2022-12-02 22:00:17

97行ans可能为负数,所以应该赋值为-INFww


by Z_X_D_ @ 2022-12-02 22:01:33

还有INF不够大


|