50分代码求助

P1253 扶苏的问题

epiphanyer @ 2023-06-01 17:37:28

#include <bits/stdc++.h>
#define ls (p<<1)
#define rs ((p<<1)|1)
typedef long long ll;
using namespace std;
const int maxn=1e6+5;
const int INF=-1e9-5;
int n,q,a[maxn],op,opl,opr;
ll opx;
ll t[maxn<<2],taga[maxn<<2],tagc[maxn<<2];
ll smax(ll a,ll b){
    return a>b?a:b;
}
void pushup(int p){
    t[p]=smax(t[ls],t[rs]);
}
void build(int p,int l,int r){
    tagc[p]=INF;
    if(l==r){
        t[p]=(ll)a[l];
        return ;
    }
    int mid=((l+r)>>1);
    build(ls,l,mid);
    build(rs,mid+1,r);
    pushup(p);
}
void pushdown(int p,int l,int r){
    if(tagc[p]!=INF){
        t[ls]=tagc[p];
        t[rs]=tagc[p];
        tagc[ls]=tagc[rs]=tagc[p];
        taga[ls]=taga[rs]=0;
        tagc[p]=INF;
    }
    if(taga[p]){
        t[ls]+=taga[p];
        t[rs]+=taga[p];
        taga[ls]+=taga[p];
        taga[rs]+=taga[p];
        taga[p]=0;
    }
}
void change(int p,int l,int r,int ql,int qr,ll k){
    if(l>=ql&&r<=qr){
        t[p]=k;
        tagc[p]=k;
        taga[p]=0;
        return ;
    }
    int mid=((l+r)>>1);
    pushdown(p,l,r);
    if(ql<=mid)change(ls,l,mid,ql,qr,k);
    if(qr>mid)change(rs,mid+1,r,ql,qr,k);
    pushup(p);
}
void add(int p,int l,int r,int ql,int qr,ll k){
    if(l>=ql&&r<=qr){
        t[p]+=k;
        taga[p]+=k;
        return ;
    }
    int mid=((l+r)>>1);
    pushdown(p,l,r);
    if(ql<=mid)add(ls,l,mid,ql,qr,k);
    if(qr>mid)add(rs,mid+1,r,ql,qr,k);
    pushup(p);
}
ll query(int p,int l,int r,int ql,int qr){
    if(l>=ql&&r<=qr){
        return t[p];
    }
    int mid=(l+r)>>1;
    ll ret=INF;
    pushdown(p,l,r);
    if(ql<=mid)ret=smax(query(ls,l,mid,ql,qr),ret);
    if(qr>mid)ret=smax(query(rs,mid+1,r,ql,qr),ret);
    return ret;
}
int main(){
//  freopen("P1253_6.in","r",stdin);
//  freopen("P1253_6.ans","w",stdout);
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    while(q--){
        scanf("%d%d%d",&op,&opl,&opr);
        if(op==1){
            scanf("%lld",&opx);
            change(1,1,n,opl,opr,opx);
        }
        if(op==2){
            scanf("%lld",&opx);
            add(1,1,n,opl,opr,opx);
        }
        if(op==3){
            printf("%lld\n",query(1,1,n,opl,opr));
        }
    }
    return 0;
} 

by epiphanyer @ 2023-06-01 17:37:48

前五个点过了


by whileAK @ 2023-07-15 18:06:26

INF不够狠,要-0x7fffffffffffffff,改完应该就可以了~


|