社区讨论

求条,过不了样例

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mko0hp8b
此快照首次捕获于
2026/01/21 20:41
4 周前
此快照最后确认于
2026/01/21 20:46
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf LONG_LONG_MAX
const int N=1e6+10;
int n,m,a[N],ans[N<<2],lz1[N<<2],lz2[N<<2];
//                     修改       增加
int ls(int id){return id<<1;}
int rs(int id){return id<<1|1;}
void pushup(int id){ans[id]=max(ans[ls(id)],ans[rs(id)]);}
void bdtree(int id,int l,int r){
    lz1[id]=inf;
    if(l==r) ans[id]=a[l];
    else{
        int mid=(l+r)>>1;
        bdtree(ls(id),l,mid);
        bdtree(rs(id),mid+1,r);
        pushup(id);
    }
}
void down1(int id,int l,int r){
    if(lz1[id]!=inf){
        ans[ls(id)]=lz1[id];
        ans[rs(id)]=lz1[id];
        lz1[ls(id)]=lz1[id];
        lz1[rs(id)]=lz1[id];
        lz2[ls(id)]=0;
        lz2[rs(id)]=0;
        lz1[id]=inf;
    }
}
void down2(int id,int l,int r){
    if(lz2[id]){
        down1(id,l,r);
        ans[ls(id)]+=lz2[id];
        ans[rs(id)]+=lz2[id];
        lz2[ls(id)]+=lz2[id];
        lz2[rs(id)]+=lz2[id];
        lz2[id]=0;
    }
}
void pushdown(int id,int l,int r){
    down1(id,l,r);
    down2(id,l,r);
}
void update1(int id,int l,int r,int L,int R,int k){
    if(L<=l&&r<=R){
        ans[id]=k;
        lz2[id]=0;
        lz1[id]=k;
        return;
    }
    pushdown(id,l,r);
    int mid=(l+r)>>1;
    if(L<=mid) update1(id,l,mid,L,R,k);
    if(mid<R) update1(id,mid+1,r,L,R,k);
    pushup(id);
}
void update2(int id,int l,int r,int L,int R,int k){
    if(L<=l&&r<=R){
        down1(id,l,r);
        ans[id]+=k;
        lz2[id]+=k;
        return;
    }
    pushdown(id,l,r);
    int mid=(l+r)>>1;
    if(L<=mid) update2(id,l,mid,L,R,k);
    if(mid<R) update2(id,mid+1,r,L,R,k);
    pushup(id);
}
int query(int id,int l,int r,int L,int R){
    if(L<=l&&r<=R) return ans[id];
    pushdown(id,l,r);
    int mid=(l+r)>>1,now=-inf;
    if(L<=mid) now=max(now,query(id,l,mid,L,R));
    if(mid<R) now=max(now,query(id,mid+1,r,L,R));
    return now;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    bdtree(1,1,n);
    for(int i=1;i<=m;i++){
        int op,x,y,k;
        cin>>op>>x>>y;
        if(op==1){
            cin>>k;
            update1(1,1,n,x,y,k);
            cout<<query(1,1,n,x,y)<<"\n";
        }else if(op==2){
            cin>>k;
            update2(1,1,n,x,y,k);
            cout<<query(1,1,n,x,y)<<"\n";
        }else{
            cout<<query(1,1,n,x,y)<<"\n";
        }
    }
    return 0;
}

回复

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

正在加载回复...