社区讨论

50pts玄关求条

P1253扶苏的问题参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mm38cict
此快照首次捕获于
2026/02/26 16:57
2 周前
此快照最后确认于
2026/02/27 22:40
2 周前
查看原帖
rt 代码:
CPP
#include<bits/stdc++.h>
#define int long long
#define N 1001000
using namespace std;
int n,m,a[N];
struct Node{
    int maxn,add,tag;
}tree[N<<2];
void build(int rt,int l,int r){
    if(l==r){
        tree[rt]={a[l],0,0};
        return ;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    tree[rt]={max(tree[rt<<1].maxn,tree[rt<<1|1].maxn),0,0};
}
void pushdown1(int rt,int l,int r){
    tree[rt<<1]={tree[rt].tag+tree[rt].add,tree[rt<<1].add+tree[rt].add,tree[rt].tag};
    tree[rt<<1|1]={tree[rt].tag+tree[rt].add,tree[rt<<1|1].add+tree[rt].add,tree[rt].tag};
    tree[rt]={max(tree[rt<<1].maxn,tree[rt<<1|1].maxn),0,0};
}
void pushdown2(int rt,int l,int r){
    tree[rt<<1]={tree[rt<<1].maxn+tree[rt].add,tree[rt<<1].add+tree[rt].add,tree[rt<<1].tag};
    tree[rt<<1|1]={tree[rt<<1|1].maxn+tree[rt].add,tree[rt<<1|1].add+tree[rt].add,tree[rt<<1|1].tag};
    tree[rt]={max(tree[rt<<1].maxn,tree[rt<<1|1].maxn),0,0};
}
int query(int rt,int l,int r,int x,int y){
    if(x<=l and r<=y)return tree[rt].maxn;
    if(tree[rt].tag)pushdown1(rt,l,r);
    else if(tree[rt].add)pushdown2(rt,l,r);
    int mid=(l+r)>>1;
    int res=-1e18;
    if(x<=mid)res=max(res,query(rt<<1,l,mid,x,y));
    if(y>mid)res=max(res,query(rt<<1|1,mid+1,r,x,y));
    return res;
}
void modify1(int rt,int l,int r,int x,int y,int k){
    if(r<=y and l>=x){
        tree[rt]={k,0,k};
        return ;
    }
    if(tree[rt].tag)pushdown1(rt,l,r);
    else if(tree[rt].add)pushdown2(rt,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)modify1(rt<<1,l,mid,x,y,k);
    if(y>mid)modify1(rt<<1|1,mid+1,r,x,y,k);
    tree[rt]={max(tree[rt<<1].maxn,tree[rt<<1|1].maxn),0,0};
}
void modify2(int rt,int l,int r,int x,int y,int k){
    if(r<=y and l>=x){
        tree[rt]={tree[rt].maxn+k,tree[rt].add+k,tree[rt].tag};
        return ;
    }
    if(tree[rt].tag)pushdown1(rt,l,r);
    else if(tree[rt].add)pushdown2(rt,l,r);
    int mid=(l+r)>>1;
    if(x<=mid)modify2(rt<<1,l,mid,x,y,k);
    if(y>mid)modify2(rt<<1|1,mid+1,r,x,y,k);
    tree[rt]={max(tree[rt<<1].maxn,tree[rt<<1|1].maxn),0,0};
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int op;
        cin>>op;
        if(op==1){
            int l,r,x;
            cin>>l>>r>>x;
            modify1(1,1,n,l,r,x);
        }
        if(op==2){
            int l,r,x;
            cin>>l>>r>>x;
            modify2(1,1,n,l,r,x);
        }
        if(op==3){
            int l,r;
            cin>>l>>r;
            cout<<query(1,1,n,l,r)<<"\n";
        }
    }
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...