只过了hack求调玄关

P2572 [SCOI2010] 序列操作

lsz0205 @ 2024-11-28 10:33:23

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int a[200010];
struct NODE {
    int l;
    int r;
    int add;
    int ze;
    int sum;
    int ma[2];
    int lma[2];
    int rma[2];
} tr[800010];
void ex(int &a,int &b){
    int t=a;
    a=b;
    b=t;
}
void pushup(NODE &root,NODE &zuo,NODE &you) {
    root.sum=zuo.sum+you.sum;
    for(int i=0; i<=1; i++) {
        root.lma[i]=zuo.lma[i];
        if(i==1&&zuo.sum==zuo.r-zuo.l+1) {
            root.lma[i]+=you.lma[i];
        } else if(i==0&&zuo.sum==0) {
            root.lma[i]+=you.lma[i];
        }

        root.rma[i]=you.rma[i];
        if(i==1&&you.sum==you.r-you.l+1) {
            root.rma[i]+=zuo.rma[i];
        } else if(i==0&&zuo.sum==0) {
            root.rma[i]+=zuo.lma[i];
        }

        root.ma[i]=zuo.rma[i]+you.lma[i];
        root.ma[i]=max(root.ma[i],zuo.ma[i]);
        root.ma[i]=max(root.ma[i],you.ma[i]);
    }
}
void pushup(int u) {
    pushup(tr[u],tr[u<<1],tr[(u<<1)|1]);
}
void build(int u,int l,int r) {
    if(l==r) {
        tr[u]=(NODE) {
            l,r,0,-1,a[l]
        };
        if(a[l]==0) {
            tr[u].ma[0]=tr[u].lma[0]=tr[u].rma[0]=1;
        } else {
            tr[u].ma[0]=tr[u].lma[0]=tr[u].rma[0]=0;
        }
        if(a[l]==1) {
            tr[u].ma[1]=tr[u].lma[1]=tr[u].rma[1]=1;
        } else {
            tr[u].ma[1]=tr[u].lma[1]=tr[u].rma[1]=0;
        }
        return ;
    }
    tr[u]=(NODE) {
        l,r,0,-1
    };
    int mid=(l+r)/2;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);

    pushup(u);
}
void work(NODE &ans,int k) {
    if(k==1) {
        ans.ze=1;
        ans.add=0;
        ans.sum=(ans.r-ans.l+1);
        ans.ma[k]=ans.lma[k]=ans.rma[k]=ans.r-ans.l+1;
        ans.ma[k^1]=ans.lma[k^1]=ans.rma[k^1]=0;
    }
    if(k==0) {
        ans.ze=0;
        ans.add=0;
        ans.sum=0;
        ans.ma[k]=ans.lma[k]=ans.rma[k]=ans.r-ans.l+1;
        ans.ma[k^1]=ans.lma[k^1]=ans.rma[k^1]=0;
    }
    if(k==3) {
        ans.sum=(ans.r-ans.l+1)-ans.sum;
        if(ans.ze!=-1) ans.ze^=1;
        else ans.add^=1;
        ex(ans.ma[0],ans.ma[1]);
        ex(ans.lma[0],ans.lma[1]);
        ex(ans.rma[0],ans.rma[1]);
    }
}
void pushdown(int u) {
    if(tr[u].ze!=-1) {
        tr[u].add=0;
        work(tr[u<<1],tr[u].ze);
        work(tr[u<<1|1],tr[u].ze);
        tr[u].ze=-1;
    }
    if(tr[u].add) {
        work(tr[u<<1],3);
        work(tr[u<<1|1],3);
        tr[u].add=0;
    }

}
NODE query(int u,int l,int r) {
    if(l<=tr[u].l&&tr[u].r<=r) return tr[u];
    pushdown(u);

    NODE ans;
    int mid=(tr[u].l+tr[u].r)/2;
    if(mid<l) ans=query(u<<1|1,l,r);
    else if(r<=mid) ans=query(u<<1,l,r);
    else {
        NODE zuo=query(u<<1,l,r);
        NODE you=query(u<<1|1,l,r);
        pushup(ans,zuo,you);
    }
    return ans;
}
void modify(int u,int l,int r,int k) {
    if(l<=tr[u].l&&tr[u].r<=r) {
        work(tr[u],k);
        return ;
    }
    pushdown(u);
    int mid=(tr[u].l+tr[u].r)/2;

    if(mid<l) modify(u<<1|1,l,r,k);
    else if(r<=mid) modify(u<<1,l,r,k);
    else {
        modify(u<<1,l,r,k);
        modify(u<<1|1,l,r,k);
    }
    pushup(u);
}
signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1; i<=n; i++) {
        scanf("%d",&a[i]);
    }
    build(1,1,n);
    while(m--) {
        int op,l,r;
        scanf("%lld%lld%lld",&op,&l,&r);
        l++,r++;
        if(op==0) {
            modify(1,l,r,0);
        } else if(op==1) {
            modify(1,l,r,1);
        } else if(op==2) {
            modify(1,l,r,3);
        } else if(op==3) {
            printf("%lld\n",query(1,l,r).sum);
        }else{
            printf("%lld\n",query(1,l,r).ma[1]);
        }
    }
    return 0;
}

by ZSYZSYZSYZSY @ 2024-11-29 19:48:15

应该是翻转错了,给你一组数据 输入

10 4
0 1 0 0 0 1 1 1 0 1 
2 5 7
2 6 9
2 0 8
4 0 2

输出

1

|