20pt on #1 #3求调

P1253 扶苏的问题

xiarui1 @ 2024-08-31 21:24:28

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define lson cur*2
#define rson cur*2+1
const int N=1000010;
int n,m,op,l,r,x,a[N];
struct node{
    int l,r,val,tag,add;
}segt[4*N];
void pushup(int cur){
    segt[cur].val=max(segt[lson].val,segt[rson].val);
}
void pushdown(int cur){
    if(segt[cur].add){
        segt[lson].add+=segt[cur].add;
        segt[lson].val+=segt[cur].add;
        segt[rson].add+=segt[cur].add;
        segt[rson].val+=segt[cur].add;
        segt[cur].add=0;
    }
    if(segt[cur].tag!=INT_MIN){
        segt[lson].tag=segt[cur].tag;
        segt[lson].val=segt[cur].tag;
        segt[lson].add=0;
        segt[rson].tag=segt[cur].tag;
        segt[rson].val=segt[cur].tag;
        segt[rson].add=0;
        segt[cur].tag=INT_MIN;
    }

}
void maketree(int cur,int l,int r){
    segt[cur].l=l;
    segt[cur].r=r;
    segt[cur].tag=INT_MIN;
    if(l==r){
        segt[cur].val=a[l];
        return;
    }
    int mid=(l+r)/2;
    maketree(lson,l,mid);
    maketree(rson,mid+1,r);
    pushup(cur);
}
int query(int cur,int l,int r){
    if(l<=segt[cur].l and segt[cur].r<=r){
        return segt[cur].val;
    }
    int mid=(segt[cur].l+segt[cur].r)/2;
    int res=-1145141919810;
    pushdown(cur);
    if(l<=mid) res=max(res,query(lson,l,mid));
    if(r>mid) res=max(res,query(rson,mid+1,r));
    return res;
}
void modify1(int cur,int l,int r,int delta){
    if(l<=segt[cur].l and segt[cur].r<=r){
        segt[cur].add=0;
        segt[cur].tag=delta;
        segt[cur].val=delta;
        return;
    }
    pushdown(cur);
    int mid=(segt[cur].l+segt[cur].r)/2;
    if(l<=mid) modify1(lson,l,r,delta);
    if(r>mid) modify1(rson,l,r,delta);
    pushup(cur);
}
void modify2(int cur,int l,int r,int delta){
    if(l<=segt[cur].l and segt[cur].r<=r){
        segt[cur].add+=delta;
        segt[cur].val+=delta;
        return;
    }
    pushdown(cur);
    int mid=(segt[cur].l+segt[cur].r)/2;
    if(l<=mid) modify2(lson,l,r,delta);
    if(r>mid) modify2(rson,l,r,delta);
    pushup(cur);
}
signed main(){
    freopen("P1253_2.in","r",stdin);
    freopen("P1253.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    maketree(1,1,n);
    for(int i=0;i<m;i++){
        cin>>op;
        if(op==1){
            cin>>l>>r>>x;
            modify1(1,l,r,x);
        }else if(op==2){
            cin>>l>>r>>x;
            modify2(1,l,r,x);
        }else{
            cin>>l>>r;
            cout<<query(1,l,r)<<"\n";
        }
//      for(int i=1;i<=n;i++){
//          cout<<query(1,i,i)<<" ";
//      }
//  cout<<"\n\n";
    }
    return 0;
}

by FwbAway @ 2024-09-20 13:01:56

@xiarui1 咱俩错误一样,我也正在求调


by Yang18630303 @ 2024-10-01 13:47:02

@FwbAway @xiarui1 +1(doge


by Joker_IV @ 2024-10-30 18:37:35

@FwbAway @xiarui1 @Yang18630303
+1,所以你们调出来了吗,我搞不懂啊


by Yang18630303 @ 2024-10-30 21:19:19

@Joker_IV 线段树主体代码有误好像就是这样


|