60求调(玄关

P1253 扶苏的问题

_Firefly__ @ 2024-09-11 22:26:20

#include<bits/stdc++.h>
#define lp p<<1
#define rp p<<1|1
#define int long long
using namespace std;
const int N=1e6+10;
int read(){
    int x=0,f=1;
    char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(isdigit(ch)){
        x=x*10+ch-48;
        ch=getchar();
    }
    return x*f;
}
struct tree{
    int add,xg,mx,used;
}tag[N<<2];
int a[N],n,m;
void pushup(int p){
    tag[p].mx=max(tag[lp].mx,tag[rp].mx); 
}
void build(int p,int l,int r){
    tag[p].mx=-1e18;
    if(l==r){
        tag[p].mx=a[l];
        return ;
    }
    int mid=l+r>>1;
    build(lp,l,mid);
    build(rp,mid+1,r);
    pushup(p);
}
void pushdown(int p){
    if(tag[p].used==0){
        tag[lp].add+=tag[p].add;
        tag[rp].add+=tag[p].add;
        tag[lp].mx+=tag[p].add;
        tag[rp].mx+=tag[p].add;
    }
    else {
        tag[lp].xg=tag[p].xg;
        tag[rp].xg=tag[p].xg;
        tag[lp].add+=tag[p].add;
        tag[rp].add+=tag[p].add;
        tag[lp].mx=tag[p].xg+tag[p].add;
        tag[rp].mx=tag[p].xg+tag[p].add;
        tag[lp].used=tag[rp].used=1;
    }
    tag[p].used=0;
    tag[p].add=0;
    tag[p].xg=0;

}
void update(int p,int l,int r,int L,int R,int c){
    if(l>R||r<L)return;
    if(l>=L&&r<=R){
        tag[p].add+=c;
        tag[p].mx+=c;
        return;
    }
    pushdown(p);
    int mid=l+r>>1;
    update(lp,l,mid,L,R,c);
    update(rp,mid+1,r,L,R,c);
    pushup(p);
}
void change(int p,int l,int r,int L,int R,int c){
    if(l>R||r<L)return;
    if(l>=L&&r<=R){
        tag[p].xg=c;
        tag[p].mx=c;
        tag[p].add=0;
        tag[p].used=1;
        return;
    }
    pushdown(p);
    int mid=l+r>>1;
    change(lp,l,mid,L,R,c);
    change(rp,mid+1,r,L,R,c);
    pushup(p);
}
int query(int p,int l,int r,int L,int R){
    if(l>R||r<L)return -1e18;
    if(l>=L&&r<=R){
        return tag[p].mx;
    }
    pushdown(p);
    int mid=l+r>>1;
    int res=-1e18;
    res=max(res,query(lp,l,mid,L,R));
    res=max(res,query(rp,mid+1,r,L,R));
    return res;

}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int opt=read(),l=read(),r=read(),x;
        if(opt==2){
            x=read();
            update(1,1,n,l,r,x);
        }
        else if(opt==1){
            x=read();
            change(1,1,n,l,r,x);
        }
        else printf("%lld\n",query(1,1,n,l,r));
    }
}

by _Firefly__ @ 2024-09-11 22:27:53

还有一个小问题,我没用used标记直接通过xg是否等于0来判断只有50加了就有60 想知道为什么


by stickman_stickmin @ 2024-09-13 18:41:25

x可能为0


by stickman_stickmin @ 2024-09-13 18:42:39

@_Firefly__ x可能为0


by _Firefly__ @ 2024-09-13 20:42:49

@stickman_stickmin %%%


by _Firefly__ @ 2024-09-19 21:56:02

过了,pushdown修改标记写成+=了 倒是没想到能有60


|