Hack过了,0pts,球跳

P2572 [SCOI2010] 序列操作

hlcg @ 2024-12-20 19:40:13

rt

#include<bits/stdc++.h>
#define int long long
#define lc p<<1
#define rc p<<1|1
#define N 100010
using namespace std;
struct lsx{
    int l,r,s1,s0,l1,l0,r1,r0,m1,m0;
    int lbchange,lbqufan;//change-1/0/1,qufan0/1
}a[N*4];
int n,m;
int w[N+10];
void pp(lsx& a,lsx i,lsx j){
    a.s1=i.s1+j.s1;
    a.s0=i.s0+j.s0;
    a.l1=(i.s0?i.l1:i.s1+j.l1);
    a.l0=(i.s1?i.l0:i.s0+j.l0);
    a.r1=(j.s0?j.r1:j.s1+i.r1);
    a.r0=(j.s1?j.r0:j.s0+i.r0);
    a.m1=max(max(i.m1,j.m1),i.r1+j.l1);
    a.m0=max(max(i.m0,j.m0),i.r0+j.l0);
    return ;
}
void pd(int p,int k){
    if(k==1){
        int len=a[p].r-a[p].l+1;
        a[p]={a[p].l,a[p].r,len,0,len,0,len,0,len,0,-1,0};

        return ;
    }
    if(k==0){
        int len=a[p].r-a[p].l+1;
        a[p]={a[p].l,a[p].r,0,len,0,len,0,len,0,len,-1,0};
        return ;
    }
    if(k==2){//qf
        swap(a[p].l0,a[p].l1);
        swap(a[p].m0,a[p].m1);
        swap(a[p].r0,a[p].r1);
        swap(a[p].s0,a[p].s1);
        a[p].lbqufan^=1;
        return ;
    }
}
void pushdown(int p){
    if(a[p].lbqufan==1){
        pd(lc,2);
        pd(rc,2);
    }
    if(a[p].lbchange==1){
        pd(lc,1);
        pd(rc,1);
    }
    if(a[p].lbchange==0){
        pd(lc,0);
        pd(rc,0);
    }
    a[p].lbchange=-1;
    a[p].lbqufan=0;
    return ;
}
void build(int p,int l,int r){
    a[p].l=l;
    a[p].r=r;
    a[p].lbchange=-1;
    if(l==r){
        if(w[l]==0){
            a[p].l0=1;
            a[p].m0=1;
            a[p].r0=1;
            a[p].s0=1;
        }else{
            a[p].l1=1;
            a[p].m1=1;
            a[p].r1=1;
            a[p].s1=1;
        }
        return ;
    }
    int mid=l+r>>1;
    build(lc,l,mid);
    build(rc,mid+1,r);
    pp(a[p],a[lc],a[rc]);
    return ;
}
void change(int p,int x,int y,int k){
    if(x<=a[p].l&&a[p].r<=y){
        pd(p,k);
        return ;
    }
    if(y<a[p].l||a[p].r<x){
        return ;
    }
    pushdown(p);
    change(lc,x,y,k);
    change(rc,x,y,k);
    pp(a[p],a[lc],a[rc]);
    return ;
}
lsx re(int p,int x,int y){
    if(y<a[p].l||a[p].r<x){
        return {};
    }
    if(x<=a[p].l&&a[p].r<=y){
        return a[p];
    }
    pushdown(p);
    lsx T;
    pp(T,re(lc,x,y),re(rc,x,y));
    return T;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>w[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int k,x,y;
        cin>>k>>x>>y;
        x++,y++;
        if(k<3){
            change(1,x,y,k);
        }else{
            lsx T;
            T=re(1,x,y);
            cout<<(k==3 ? (T.s1) : (T.m1-1));
            puts("");
        }
    }
    return 0;
} 

|