傻逼题……
维护0和1的左最长右最长和最长还有和,打覆盖标和翻转标即可
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<vector>
#include<map>
#include<set>
#include<bitset>
#include<queue>
#include<stack>
using namespace std;
#define MAXN 100010
#define MAXM 1010
#define INF 1000000000
#define MOD 1000000007
#define eps 1e-8
#define ll long long
struct data{
int lv;
int rv;
int mx;
int len;
friend data operator +(data x,data y){
data z;
z.lv=x.lv;
z.rv=y.rv;
if(x.lv==x.len){
z.lv+=y.lv;
}
if(y.rv==y.len){
z.rv+=x.rv;
}
z.len=x.len+y.len;
z.mx=max(x.rv+y.lv,max(x.mx,y.mx));
return z;
}
};
data v[2][MAXN<<2];
int s[2][MAXN<<2];
int ch[MAXN<<2];
bool rev[MAXN<<2];
int n,m;
inline void ud(int x){
v[0][x]=v[0][x<<1]+v[0][x<<1|1];
v[1][x]=v[1][x<<1]+v[1][x<<1|1];
s[0][x]=s[0][x<<1]+s[0][x<<1|1];
s[1][x]=s[1][x<<1]+s[1][x<<1|1];
}
inline void toch(int x,int y){
v[y][x].lv=v[y][x].rv=v[y][x].mx=s[y][x]=v[y][x].len;
v[y^1][x].mx=v[y^1][x].lv=v[y^1][x].rv=s[y^1][x]=0;
ch[x]=y;
rev[x]=0;
}
inline void torev(int x){
rev[x]^=1;
swap(v[0][x],v[1][x]);
swap(s[0][x],s[1][x]);
if(ch[x]!=-1){
ch[x]^=1;
}
}
inline void pd(int x){
if(rev[x]){
torev(x<<1);
torev(x<<1|1);
rev[x]=0;
}
if(ch[x]!=-1){
toch(x<<1,ch[x]);
toch(x<<1|1,ch[x]);
ch[x]=-1;
}
}
void build(int x,int y,int z){
ch[x]=-1;
if(y==z){
int t;
scanf("%d",&t);
v[0][x].len=v[1][x].len=1;
s[t][x]=1;
v[t][x].mx=v[t][x].lv=v[t][x].rv=1;
return ;
}
int mid=y+z>>1;
build(x<<1,y,mid);
build(x<<1|1,mid+1,z);
ud(x);
}
data ask(int x,int y,int z,int l,int r,int av){
if(y==l&&z==r){
return v[av][x];
}
pd(x);
int mid=y+z>>1;
if(r<=mid){
return ask(x<<1,y,mid,l,r,av);
}else if(l>mid){
return ask(x<<1|1,mid+1,z,l,r,av);
}else{
data t1=ask(x<<1,y,mid,l,mid,av);
data t2=ask(x<<1|1,mid+1,z,mid+1,r,av);
return t1+t2;
return ask(x<<1,y,mid,l,mid,av)+ask(x<<1|1,mid+1,z,mid+1,r,av);
}
}
int ask2(int x,int y,int z,int l,int r,int av){
if(y==l&&z==r){
return s[av][x];
}
pd(x);
int mid=y+z>>1;
if(r<=mid){
return ask2(x<<1,y,mid,l,r,av);
}else if(l>mid){
return ask2(x<<1|1,mid+1,z,l,r,av);
}else{
return ask2(x<<1,y,mid,l,mid,av)+ask2(x<<1|1,mid+1,z,mid+1,r,av);
}
}
void change(int x,int y,int z,int l,int r,int cv){
if(y==l&&z==r){
toch(x,cv);
return ;
}
pd(x);
int mid=y+z>>1;
if(r<=mid){
change(x<<1,y,mid,l,r,cv);
}else if(l>mid){
change(x<<1|1,mid+1,z,l,r,cv);
}else{
change(x<<1,y,mid,l,mid,cv);
change(x<<1|1,mid+1,z,mid+1,r,cv);
}
ud(x);
}
void change2(int x,int y,int z,int l,int r){
if(y==l&&z==r){
torev(x);
return ;
}
pd(x);
int mid=y+z>>1;
if(r<=mid){
change2(x<<1,y,mid,l,r);
}else if(l>mid){
change2(x<<1|1,mid+1,z,l,r);
}else{
change2(x<<1,y,mid,l,mid);
change2(x<<1|1,mid+1,z,mid+1,r);
}
ud(x);
}
int main(){
int i,o,x,y;
scanf("%d%d",&n,&m);
build(1,1,n);
while(m--){
scanf("%d%d%d",&o,&x,&y);
x++;
y++;
if(o==0){
change(1,1,n,x,y,0);
}
if(o==1){
change(1,1,n,x,y,1);
}
if(o==2){
change2(1,1,n,x,y);
}
if(o==3){
printf("%d\n",ask2(1,1,n,x,y,1));
}
if(o==4){
printf("%d\n",ask(1,1,n,x,y,1).mx);
}
}
return 0;
}
/*
10 10
0 0 0 1 1 0 1 0 1 1
1 0 2
3 0 5
2 2 2
4 0 4
0 3 6
2 3 7
4 2 8
1 0 5
0 5 6
3 3 9
*/