xxxaIq @ 2024-12-05 20:57:58
题目的样例和 这里的所有hack 以及数据中的 hack 都过了,但是 WA 0pts求调。
//code by xxxalq
#include<bits/stdc++.h>
#define ll long long
#define mid ((t[p].l+t[p].r)/2)
using namespace std;
const int maxn=100003;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch>57||ch<48){
if(ch==45){
f=-1;
}
ch=getchar();
}
while(ch>=48&&ch<=57){
x=(x<<1)+(x<<3)+(ch-48);
ch=getchar();
}
return x*f;
}
struct node{
int l,r,v[2],sum,lv[2],rv[2],mk,qf;
}t[maxn<<2];
void pushup(int p){
t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
for(int i=0;i<2;i++){
t[p].v[i]=max(max(t[p<<1].v[i],t[p<<1|1].v[i]),t[p<<1].rv[i]+t[p<<1|1].lv[i]);
t[p].lv[i]=t[p<<1].lv[i];
if(t[p<<1].lv[i]==mid-t[p].l+1){
t[p].lv[i]+=t[p<<1|1].lv[i];
}
t[p].rv[i]=t[p<<1|1].rv[i];
if(t[p<<1|1].rv[i]==t[p].r-mid){
t[p].rv[i]+=t[p<<1].rv[i];
}
}
return;
}
void pushdown(int p){
if(t[p].mk){
t[p].mk=0;
t[p<<1].v[1]=t[p<<1].lv[1]=t[p<<1].rv[1]=0;
t[p<<1|1].v[1]=t[p<<1|1].lv[1]=t[p<<1|1].rv[1]=0;
t[p<<1].sum=t[p<<1|1].sum=0;
t[p<<1].v[0]=t[p<<1].lv[0]=t[p<<1].rv[0]=mid-t[p].l+1;
t[p<<1|1].v[0]=t[p<<1|1].lv[0]=t[p<<1|1].rv[0]=t[p].r-mid;
t[p<<1].mk=t[p<<1|1].mk=1;
t[p<<1].qf=t[p<<1|1].qf=0;
}
if(t[p].qf){
t[p].qf=0;
t[p<<1].sum=mid-t[p].l+1-t[p<<1].sum;
swap(t[p<<1].lv[0],t[p<<1].lv[1]);
swap(t[p<<1].rv[0],t[p<<1].rv[1]);
swap(t[p<<1].v[0],t[p<<1].v[1]);
t[p<<1|1].sum=t[p].r-mid-t[p<<1|1].sum;
swap(t[p<<1|1].lv[0],t[p<<1|1].lv[1]);
swap(t[p<<1|1].rv[0],t[p<<1|1].rv[1]);
swap(t[p<<1|1].v[0],t[p<<1|1].v[1]);
t[p<<1].qf^=1;
t[p<<1|1].qf^=1;
}
return;
}
void update(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r){
t[p].sum=0;
t[p].v[1]=t[p].lv[1]=t[p].rv[1]=0;
int len=t[p].r-t[p].l+1;
t[p].v[0]=t[p].lv[0]=t[p].rv[0]=len;
t[p].qf=0;
t[p].mk=1;
return;
}
pushdown(p);
if(l<=mid){
update(p<<1,l,r);
}
if(r>mid){
update(p<<1|1,l,r);
}
pushup(p);
return;
}
void qufan(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r){
t[p].sum=t[p].r-t[p].l+1-t[p].sum;
swap(t[p].lv[0],t[p].lv[1]);
swap(t[p].rv[0],t[p].rv[1]);
swap(t[p].v[0],t[p].v[0]);
t[p].qf^=1;
return;
}
pushdown(p);
if(l<=mid){
qufan(p<<1,l,r);
}
if(r>mid){
qufan(p<<1|1,l,r);
}
pushup(p);
return;
}
node query(int p,int l,int r){
if(l<=t[p].l&&t[p].r<=r){
return t[p];
}
pushdown(p);
if(l>mid){
return query(p<<1|1,l,r);
}
if(r<=mid){
return query(p<<1,l,r);
}
node res,resl=query(p<<1,l,r),resr=query(p<<1|1,l,r);
res.sum=resl.sum+resr.sum;
for(int i=0;i<2;i++){
res.v[i]=max(max(resl.v[i],resr.v[i]),resl.rv[i]+resr.lv[i]);
res.lv[i]=resl.lv[i];
if(resl.lv[i]==min(mid-t[p].l+1,mid-l+1)){
res.lv[i]+=resr.lv[i];
}
res.rv[i]=resr.rv[i];
if(resr.rv[i]==min(r-mid,t[p].r-mid)){
res.rv[i]+=resl.rv[i];
}
}
return res;
}
int n,m,a[maxn];
void build(int p,int l,int r){
t[p].l=l,t[p].r=r;
if(l==r){
t[p].sum=a[l];
for(int i=0;i<2;i++){
t[p].v[i]=t[p].lv[i]=t[p].rv[i]=(a[l]==i);
}
return;
}
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
// cout<<p<<' '<<l<<" "<<r<<"\n";
// for(int i=0;i<2;i++){
// cout<<t[p].v[i]<<" "<<t[p].lv[i]<<" "<<t[p].rv[i]<<"\n";
// }
// cout<<"\n";
return;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
}
build(1,1,n);
while(m--){
int op=read(),l=read()+1,r=read()+1;
if(op==0){
update(1,l,r);
}else if(op==1){
update(1,l,r);
qufan(1,l,r);
}else if(op==2){
qufan(1,l,r);
}else if(op==3){
cout<<query(1,l,r).sum<<"\n";
}else{
cout<<query(1,l,r).v[1]<<"\n";
}
// for(int i=1;i<=n;i++){
// cout<<query(1,i,i).sum<<" ";
// }
// cout<<"\n";
}
return 0;
}