George1123 @ 2020-01-23 15:41:29
/******************
. .
/\OwO/\
/ ' ' \
Konny Wendigo
******************/
#include <bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define of(i,b,a) for(int i=b;i>=a;i--)
// const int L=1<<16;
// char buf[L],*S,*T;
// inline char Gc(){
// if(S==T){T=(S=buf)+fread(buf,1,L,stdin);
// if(S==T) return EOF;}
// return *S++;
// }
// inline int d(){
// char c;int f=1,x;
// for(c=Gc();c>'9'||c<'0';c=Gc())
// if(c=='-') f=-1;
// for(x=0;c>='0'&&c<='9';c=Gc())
// x=(x<<1)+(x<<3)+c-'0';
// return x*f;
// }
int d(){int x;scanf("%d",&x);return x;}
const int N=1e5+10;
int n,m,a[N];
class ones{public:int sum,lf,rt,v;};
class sumtree{
private:
int sum[2][N<<2],lf[2][N<<2],rt[2][N<<2],v[2][N<<2],mk[2][N<<2],fl[N<<2];
void pushup(int k,int l,int r){
int mid=(l+r)>>1;
fo(b,0,1){
sum[b][k]=sum[b][k<<1]+sum[b][k<<1|1];
if(sum[b][k<<1]<mid-l+1)
lf[b][k]=lf[b][k<<1];
else lf[b][k]=sum[b][k<<1]+lf[b][k<<1|1];
if(sum[b][k<<1|1]<r-mid)
rt[b][k]=rt[b][k<<1|1];
else rt[b][k]=sum[b][k<<1|1]+rt[b][k<<1];
v[b][k]=max(max(v[b][k<<1],v[b][k<<1|1]),rt[b][k<<1]+lf[b][k<<1|1]);
}
}
void pushdown(int k,int l,int r){
int mid=(l+r)>>1;
fo(b,0,1) if(mk[b][k]){
sum[b][k<<1]=lf[b][k<<1]=rt[b][k<<1]=v[b][k<<1]=(mid-l+1);
sum[b][k<<1|1]=lf[b][k<<1|1]=rt[b][k<<1|1]=v[b][k<<1|1]=(r-mid);
mk[b][k<<1]=mk[b][k<<1|1]=mk[b][k],mk[b][k]=0;
}
if(fl[k]){
swap(sum[0][k<<1],sum[1][k<<1]);
swap(lf[0][k<<1],lf[1][k<<1]);
swap(rt[0][k<<1],rt[1][k<<1]);
swap(v[0][k<<1],v[1][k<<1]);
swap(sum[0][k<<1|1],sum[1][k<<1|1]);
swap(lf[0][k<<1|1],lf[1][k<<1|1]);
swap(rt[0][k<<1|1],rt[1][k<<1|1]);
swap(v[0][k<<1|1],v[1][k<<1|1]);
fl[k<<1]=fl[k<<1|1]=fl[k],fl[k]=0;
}
}
public:
// void check(){printf("%d\n",v[1][1]);}
void build(int k=1,int l=1,int r=n){
if(l==r){
fo(b,0,1) sum[b][k]=lf[b][k]=rt[b][k]=v[b][k]=(a[l]==b);
return;
}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
pushup(k,l,r);
}
void fix(int x,int y,bool z,int k=1,int l=1,int r=n){
if(x<=l&&r<=y){
sum[!z][k]=lf[!z][k]=rt[!z][k]=v[!z][k]=0;
sum[z][k]=lf[z][k]=rt[z][k]=v[z][k]=r-l+1;
mk[z][k]=1; return;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
if(mid>=x) fix(x,y,z,k<<1,l,mid);
if(mid<y) fix(x,y,z,k<<1|1,mid+1,r);
pushup(k,l,r);
}
void flip(int x,int y,int k=1,int l=1,int r=n){
if(x<=l&&r<=y){
swap(sum[0][k],sum[1][k]);
swap(lf[0][k],lf[1][k]);
swap(rt[0][k],rt[1][k]);
swap(v[0][k],v[1][k]);
fl[k]=1; return;
}
pushdown(k,l,r);
int mid=(l+r)>>1;
if(mid>=x) flip(x,y,k<<1,l,mid);
if(mid<y) flip(x,y,k<<1|1,mid+1,r);
pushup(k,l,r);
}
int fsum(int x,int y,int k=1,int l=1,int r=n){
if(x<=l&&r<=y) return sum[1][k];
pushdown(k,l,r);
int mid=(l+r)>>1,V=0;
if(mid>=x) V+=fsum(x,y,k<<1,l,mid);
if(mid<y) V+=fsum(x,y,k<<1|1,mid+1,r);
return V;
}
ones fun(int x,int y,int k=1,int l=1,int r=n){
if(x<=l&&r<=y) return ones{sum[1][k],lf[1][k],rt[1][k],v[1][k]};
pushdown(k,l,r);
int mid=(l+r)>>1;
if(mid>=y) return fun(x,y,k<<1,l,mid);
if(mid<x) return fun(x,y,k<<1|1,mid+1,r);
ones L=fun(x,y,k<<1,l,mid),R=fun(x,y,k<<1|1,mid+1,r),V;
V=(ones){L.sum+R.sum,(L.sum==mid-l+1)?L.sum+R.lf:L.lf,
(R.sum==r-mid)?R.sum+L.rt:R.rt,max(max(L.v,R.v),L.rt+R.lf)};
return V;
}
}c;
int main(){
n=d(),m=d(); fo(i,1,n) a[i]=d();
c.build();
fo(i,1,m){
int k=d(),l=d()+1,r=d()+1;
if(k==0) c.fix(l,r,0);
else if(k==1) c.fix(l,r,1);
else if(k==2) c.flip(l,r);
else if(k==3) printf("%d\n",c.fsum(l,r));
else printf("%d\n",c.fun(l,r).v);
// fo(j,1,n) printf("%d%c",c.fsum(j,j)," \n"[j==n]);
}
return 0;
}
代码很短,但蒟蒻调不出来。
求助路佬甲,帮我看看吧!
by RainsAFO @ 2020-01-23 16:31:10
@♗Wendigo♝
我这题也不会正解啊,odt被卡了
by George1123 @ 2020-01-23 16:35:41