样例没过,求调

P2572 [SCOI2010] 序列操作

BLty777 @ 2024-12-20 19:41:53

#include<bits/stdc++.h>
#define int long long
#define l(p) p<<1
#define r(p) p<<1|1
using namespace std;
const int N=1e5+5;
int n,m,a[N],id,x,y;
struct stu{
    int l,r,b,lb,rb,mb,c,lc,rc,mc,len,tag,rev;
}tr[4*N];
void pushup(stu &p,stu l,stu r){
    p.b=l.b+r.b;
    p.lb=l.c?l.lb:l.b+r.lb;
    p.rb=r.c?r.rb:r.b+l.rb;
    p.mb=max(max(l.mb,r.mb),l.rb+r.lb);
    p.c=l.c+r.c;
    p.lc=l.b?l.lc:l.c+r.lc;
    p.rc=r.b?r.rc:r.c+l.rc;
    p.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void build(int p,int l,int r){
    tr[p]={l,r,a[l],a[l],a[l],a[l],a[l]^1,a[l]^1,a[l]^1,a[l]^1,r-l+1,-1,0};
    if(l==r) return ;
    int mid=(l+r)>>1;
    build(l(p),l,mid);
    build(r(p),mid+1,r);
    pushup(tr[p],tr[l(p)],tr[r(p)]);
}
void pd(int p,int k){
    if(k==0){
        tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=0;
        tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=tr[p].len;
        tr[p].tag=-1;
        tr[p].rev=0;
    }
    if(k==1){
        tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=tr[p].len;
        tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=0;
        tr[p].tag=-1;
        tr[p].rev=0;
    }
    if(k==2){
        swap(tr[p].b,tr[p].c);
        swap(tr[p].lb,tr[p].lc);
        swap(tr[p].rb,tr[p].rc);
        swap(tr[p].mb,tr[p].mc);
        tr[p].rev^=1;
    }
}
void pushdown(int p){
    if(!tr[p].tag) pd(l(p),0),pd(r(p),0);
    if(tr[p].tag==1) pd(l(p),1),pd(r(p),1);
    if(tr[p].rev) pd(l(p),2),pd(r(p),2);
    tr[p].tag=-1;
    tr[p].rev=0;
}
stu query(int p,int x,int y){
    if(tr[p].r>y||tr[p].l<x) return {};
    if(tr[p].l>=x&&tr[p].r<=y) return tr[p];
    pushdown(p);
    stu t;
    pushup(t,query(l(p),x,y),query(r(p),x,y));
    return t;
}
void change(int p,int x,int y,int k){
    if(tr[p].l>y||tr[p].r<x) return ;
    if(tr[p].l>=x&&tr[p].l<=y){
        pd(p,k);
        return ;
    }
    pushdown(p);
    int mid=(tr[p].l+tr[p].r)>>1;
    if(x<=mid) change(l(p),x,y,k);
    else change(r(p),x,y,k);
    pushup(tr[p],tr[l(p)],tr[r(p)]);
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        scanf("%lld",&id,&x,&y);
        x++,y++;
        if(id<3){
            change(1,x,y,id);
        }else{
            stu t=query(1,x,y);
            printf("%lld\n",id==3?t.b:t.mb);
        }
    }
    return 0;
} 

|