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