社区讨论

G

题目总版参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mkida071
此快照首次捕获于
2026/01/17 21:52
上个月
此快照最后确认于
2026/01/20 23:55
4 周前
查看原帖
脑子不太清醒,自己都不知道自己在写啥,如果哪里糖了别骂就当我在说梦话 /ll
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,q;
struct tree{
    int l,r,sum,tag,maxn;
    bool flag,tag2;
}t[800005];
void pushdown(int id){
    if(t[id].tag==-1){
        t[id<<1].tag=-1;
        t[id<<1].sum=0;
        t[id<<1|1].tag=-1;
        t[id<<1|1].sum=0;
        t[id].tag=0;
    }
    if(t[id].tag){
        t[id<<1].sum=t[id].tag*(t[id<<1].r-t[id<<1].l+1);
        t[id<<1].tag=t[id].tag;
        t[id<<1|1].sum=t[id].tag*(t[id<<1|1].r-t[id<<1|1].l+1);
        t[id<<1|1].tag=t[id].tag;
        t[id].tag=0;
    }
    if(t[id].tag2){
        t[id<<1].flag=!t[id<<1].flag;
        t[id<<1].tag2=t[id].tag;
        t[id<<1|1].flag=!t[id<<1|1].flag;
        t[id<<1|1].tag2=t[id].tag;
        t[id].tag=0;
    }
}
void build(int id,int l,int r){
    t[id].l=l;
    t[id].r=r;
    t[id].sum=0;
    t[id].flag=1;
    t[id].tag=0;
    t[id].tag2=0;
    t[id].maxn=0;
    if(l==r)return;
    int mid=l+r>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
}
void update1(int id,int L,int R,int k){
    if(L<=t[id].l&&t[id].r<=R){
        t[id].tag+=k*(t[id].r-t[id].l+1);
        return;
    }
    pushdown(id);
    int mid=t[id].l+t[id].r>>1;
    if(L<=mid)update1(id<<1,L,R,k);
    if(mid+1<=R)update1(id<<1|1,L,R,k);
    t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
    t[id].maxn=max(t[id<<1].maxn,t[id<<1|1].maxn);
}
void update2(int id,int l,int r){
    if(l<=t[id].l&&t[id].r<=r){
        t[id].tag=-1;
        t[id].tag2=!t[id].tag2;
        return;
    }
    pushdown(id);
    int mid=t[id].l+t[id].r>>1;
    if(l<=mid)update2(id<<1,l,r);
    if(mid+1<=r)update2(id<<1|1,l,r);
    t[id].sum=t[id<<1].sum+t[id<<1|1].sum;
    t[id].maxn=max(t[id<<1].maxn,t[id<<1|1].maxn);
}
int query(int id,int l,int r){
    if(l<=t[id].l&&t[id].r<=r)return t[id].maxn;
    int mid=t[id].l+t[id].r>>1,ans=0;
    if(l<=mid)ans=max(ans,query(id<<1,l,r));
    if(mid+1<=r)ans=max(ans,query(id<<1|1,l,r));
    return ans;
}
signed main(){
    cin>>n>>q;
    build(1,1,n);
    while(q--){
        int t,l,r;
        cin>>t>>l>>r;
        if(t==1){
            int x;
            cin>>x;
            update1(1,l,r,x);
        }
        else if(t==2){
            update2(1,l,r);
        }
        else cout<<query(1,l,r)<<'\n';
    }
    return 0;
}

回复

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

正在加载回复...