全wa求助

P2572 [SCOI2010] 序列操作

LLX7 @ 2024-12-20 19:50:48


#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=1e5+1;
int a[N];
struct tree{
    int len,l,r;
    int tag,rev;
    int mb,lb,lc,mc,rb,rc,b,c;
}tr[N*4];
void pushup(tree &u,tree l,tree r){
    u.b=l.b+r.b;
    u.lb=l.c?l.lb:l.len+r.lb;
    u.rb=r.c?r.rb:r.len+l.rb;
    u.mb=max(max(l.mb,r.mb),l.rb+r.lb);
    u.c=l.c+r.c;
    u.lc=l.b?l.lc:l.len+r.lc;
    u.rc=r.c?r.rc:r.len+l.rc;
    u.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void build(int p,int l,int r){
    int t=a[l];
    tr[p]={r-l+1,l,r,-1,0,t,t,t,t^1,t^1,t^1,t,t^1};
    if(l==r){
        return ;
    }
    int mid=l+r>>1;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    pushup(tr[p],tr[p*2],tr[p*2+1]);
}
void pd(int u,int opt){
    tree& t=tr[u];
    if(opt==1){
        t.b=0,t.lb=0,t.rb=0,t.mb=0;
        t.c=t.len,t.lc=t.len,t.rc=t.len,t.mc=t.len;
        t.tag=0,t.rev=0;
    }
    if(opt==2){
        t.c=0,t.rc=0,t.lc=0,t.mc=0;
        t.b=t.len,t.lb=t.len,t.rb=t.len,t.mb=t.len;
        t.tag=1,t.rev=0;
    }
    if(opt==3){
        swap(t.c,t.b);
        swap(t.rc,t.rb);
        swap(t.lb,t.lc);
        swap(t.mc,t.mb);
        t.tag=-1,t.rev^=1;
    }
}
void pushdown(int u){
    tree& t=tr[u];
    int ls=u*2,rs=u*2+1; 
    if(t.tag==0){
        pd(ls,0);
        pd(rs,0);
    }
    if(t.tag==1){
        pd(ls,1);
        pd(rs,1);
    } 
    if(t.tag==3){
        pd(ls,3);
        pd(rs,3);
    }
    t.tag=-1,t.rev=0;
}
void updata(int p,int x,int y,int k){
    if(tr[p].l>=x&&tr[p].r<=y){
        pd(p,k);
        return ;
    }
    int mid=tr[p].l+tr[p].r>>1;
    pushdown(p);
    if(x<=mid){
        updata(p*2,x,y,k);
    }
    if(y>mid){
        updata(p*2+1,x,y,k);
    }
    pushup(tr[p],tr[p*2],tr[p*2+1]);
}
tree query(int p,int x,int y){
    if(y<tr[p].l||x>tr[p].r) return {};
    if(tr[p].l>=x&&tr[p].r<=y){
        return tr[p];
    }
    int mid=tr[p].l+tr[p].r>>1;
    pushdown(p);
    tree T;
    pushup(T,query(p*2,x,y),query(p*2+1,x,y));
    return T;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    while(m--){
        int id,l,r;
        cin>>id>>l>>r;
        l++,r++; 
        if(id<3){
            updata(1,l,r,id);
        }
        if(id==3){
            cout<<query(1,l,r).b<<"\n";
        }
        if(id==4){
            cout<<query(1,l,r).mb<<"\n";
        }
    }
    return 0;
}

|