写挂了
明天再调
#include <bits/stdc++.h>
#define il inline
#define Max 500005
#define ls(x) x<<1
#define rs(x) x<<1|1
using namespace std;
int n,m,t[Max],rv[Max],mx[Max][2],lx[Max][2],rx[Max][2],tg[Max],v[Max];
il int read()
{
char c=getchar();
int x=0;
while(c>'9'||c<'0')
c=getchar();
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x;
}
il void pushup(int x,int l,int r)
{
t[x]=t[ls(x)]+t[rs(x)];
int mid=(l+r)>>1;
for(int i=0;i<=1;i++)
{
lx[x][i]=lx[ls(x)][i];
if(i&&t[ls(x)]==(mid-l+1)) lx[x][i]+=lx[rs(x)][i];
if(!i&&!t[ls(x)]) lx[x][i]+=lx[rs(x)][i];
rx[x][i]=rx[rs(x)][i];
if(i&&t[rs(x)]==(r-mid)) rx[x][i]+=rx[ls(x)][i];
if(!i&&!t[rs(x)]) rx[x][i]+=rx[ls(x)][i];
mx[x][i]=lx[rs(x)][i]+rx[(ls(x))][i];
mx[x][i]=max(mx[x][i],max(mx[ls(x)][i],mx[rs(x)][i]));
}
}
il void pushdown(int x,int l,int r)
{
if(tg[x]!=-1)
{
int w=tg[x],mid=(l+r)>>1;
tg[x]=-1;
rv[x]=rv[ls(x)]=rv[rs(x)]=0;
tg[rs(x)]=tg[ls(x)]=w;
t[ls(x)]=(mid-l+1)*w;
t[rs(x)]=(r-mid)*w;
mx[ls(x)][w]=lx[ls(x)][w]=rx[ls(x)][w]=mid-l+1;
mx[rs(x)][w]=lx[rs(x)][w]=rx[ls(x)][w]=r-mid;
w^=1;
mx[ls(x)][w]=mx[rs(x)][w]=lx[ls(x)][w]=lx[rs(x)][w]=rx[ls(x)][w]=rx[rs(x)][w]=0;
}
if(rv[x])
{
int mid=(l+r)>>1;
rv[x]=0;
t[ls(x)]=mid-l+1-t[ls(x)];
t[rs(x)]=r-mid-t[rs(x)];
if(tg[ls(x)]!=-1) tg[ls(x)]^=1;
else rv[ls(x)]^=1;
if(tg[rs(x)]!=-1) tg[rs(x)]^=1;
else rv[rs(x)]^=1;
swap(lx[ls(x)][1],lx[ls(x)][0]);
swap(rx[ls(x)][1],rx[ls(x)][0]);
swap(lx[rs(x)][1],lx[rs(x)][0]);
swap(rx[rs(x)][1],rx[rs(x)][0]);
swap(mx[ls(x)][0],mx[ls(x)][1]);
swap(mx[rs(x)][0],mx[rs(x)][1]);
}
}
il void build(int x,int l,int r)
{
tg[x]=-1;
if(l==r)
{
t[x]=v[l];
mx[x][0]=lx[x][0]=rx[x][0]=!v[l];
mx[x][1]=lx[x][1]=rx[x][1]=v[l];
return;
}
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x,l,r);
}
struct node
{
int lx,rx,mx,len;
node(int L=0,int R=0,int M=0,int LN=0)
{
lx=L,rx=R,mx=M,len=LN;
}
};
il void mdf(int x,int l,int r,int ql,int qr,int w)
{
if(ql<=l&&r<=qr)
{
if(w==2)
{
t[x]=r-l+1-t[x];
rv[x]^=1;
swap(lx[x][1],lx[x][0]);
swap(rx[x][1],rx[x][0]);
swap(mx[x][1],mx[x][0]);
}
else
{
t[x]=(r-l+1)*w;
tg[x]=w;
mx[x][w]=lx[x][w]=rx[x][w]=r-l+1;
w^=1;
mx[x][w]=lx[x][w]=rx[x][w]=0;
}
return;
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(ql<=mid) mdf(ls(x),l,mid,ql,qr,w);
if(qr>mid) mdf(rs(x),mid+1,r,ql,qr,w);
pushup(x,l,r);
}
il int qry(int x,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return t[x];
}
pushdown(x,l,r);
int mid=(l+r)>>1,res=0;
if(ql<=mid) res+=qry(ls(x),l,mid,ql,qr);
if(qr>mid) res+=qry(rs(x),mid+1,r,ql,qr);
return res;
}
il node qmax(int x,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return node(lx[x][1],rx[x][1],mx[x][1],r-l+1);
}
pushdown(x,l,r);
int mid=(l+r)>>1;
if(ql>mid) return qmax(rs(x),mid+1,r,ql,qr);
else if(qr<=mid) return qmax(ls(x),l,mid,ql,qr);
else
{
node tl=qmax(ls(x),l,mid,ql,qr),tr=qmax(rs(x),mid+1,r,ql,qr);
return node((tl.lx==tl.len?tl.lx+tr.lx:tl.lx),
(tr.rx==tr.len?tr.rx+tl.rx:tr.rx),
max(max(tl.mx,tr.mx),tl.rx+tr.lx),
tl.len+tr.len);
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) v[i]=read();
build(1,1,n);
while(m--)
{
int opt=read(),l=read()+1,r=read()+1;
if(opt<3) mdf(1,1,n,l,r,opt);
else if(opt==4) printf("%d\n",qry(1,1,n,l,r));
else printf("%d\n",qmax(1,1,n,l,r).mx);
}
}
最后一次更新于2021-09-28 02:18:31
0 条评论