50分求调(悬关)

P1253 扶苏的问题

stmo @ 2024-01-17 14:42:17

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
const int N=4e6+10;
typedef long long LL; 
int n;
int a[N];
struct node{
    int l,r;
    LL ma;
    LL ad;
    LL b;
    bool f;
}tr[N];
void pushup(int u){
    tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
}
void pushdown(int u){
    if(tr[u].f){
    int le=u<<1,ri=u<<1|1;
    tr[le].ma=tr[u].b;
    tr[le].ad=0;
    tr[ri].ma=tr[u].b;
    tr[ri].ad=0;

    tr[ri].b=tr[u].b;
    tr[le].b=tr[u].b;
    tr[le].f=true;
    tr[ri].f=true;

    tr[u].f=false;

  }
  if(tr[u].ad){
    int add=tr[u].ad;
    tr[u].ad=0;
    tr[u<<1].ad+=add;
    tr[u<<1].ma+=add;
    tr[u<<1|1].ad+=add;
    tr[u<<1|1].ma+=add;
  }

}
void build(int u,int l,int r){//先变后加
    tr[u].l=l;tr[u].r=r;
    tr[u].ad=0;//加
    tr[u].b=0;//变
    tr[u].f=false;//是否有变
    if(l==r)tr[u].ma=a[l];
    else{
        int mid=(l+r)>>1;
        build(u<<1,l,mid);
        build(u<<1|1,mid+1,r);
        pushup(u);
    }
}
void modi1(int u,int l ,int r,int k){//区间变为k
    if(tr[u].l>=l&&tr[u].r<=r){
       tr[u].ma=k;
       tr[u].f=true;
       tr[u].b=k;
       tr[u].ad=0;
    }
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid)modi1(u<<1,l,r,k);
        if(r>mid)modi1(u<<1|1,l,r,k);
        pushup(u);
    }
}
void modi2(int u,int l,int r,int x){
    if(tr[u].l>=l&&tr[u].r<=r){
        tr[u].ma+=x;
        tr[u].ad+=x;
    }
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid)modi2(u<<1,l,r,x);
        if(r>mid)modi2(u<<1|1,l,r,x);
        pushup(u);
    }
}
LL ask(int u,int l,int r){
    LL res=-21474836470000;
    if(tr[u].l>=l&&tr[u].r<=r)return tr[u].ma;
    else{
        pushdown(u);
        int mid=(tr[u].l+tr[u].r)>>1;
        if(l<=mid)res=max(res,ask(u<<1,l,r));
        if(r>mid)res=max(ask(u<<1|1,l,r),res);
        return res;
    }
}
int main(){
    ios::sync_with_stdio(false);
    LL m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    build(1,1,n);
    while(m--){
        int c;
        cin>>c;
        if(c==1){
            LL l,r,x;
            cin>>l>>r>>x;
            modi1(1,l,r,x);
        }
        if(c==2){
            LL l,r,x;
            cin>>l>>r>>x;
            modi2(1,l,r,x);
        }
        if(c==3){
            LL l,r;cin>>l>>r;
            cout<<ask(1,l,r)<<"\n";
        }
        }
    return 0;
}

by 杜都督 @ 2024-01-30 04:46:53

50分基本都是long long的问题,你这个也是

你在绝大多数需要开LL的地方都写对了,唯独漏了1处

第41行,也就是pushdown的第二个if里,你用于缓存tr[u].ad的add是int的,改成LL就能100分


by stmo @ 2024-02-01 12:49:50

谢谢佬


|