fly_me_2_the_moon @ 2020-11-10 22:29:01
#include<bits/stdc++.h>
#define ll long long
#define ri register int
#define mid ((l+r)>>1)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define maxn 500000
using namespace std;
ll read()
{
ll x=0,f=1;char c=getchar();
while(c<'0'||c>'9') f=(c=='-')?-1:1,c=getchar();
while(c>='0'&&c<='9') x=x*10+c-48,c=getchar();
return f*x;
}
inline void print(ll x)
{
static ll cnt;
static ll a[15];
cnt=0;
do
{
a[++cnt]=x%10;
x/=10;
}while(x);
for(ll i=cnt;i>=1;i--)putchar(a[i]+'0');
puts("");
}
ll n,m,x,y,op,res;
ll w[maxn];
struct tywl
{
ll a[3],l[3],r[3],sa,len,laz,fa;
}t[maxn];
inline void up1(ll rt)
{
t[rt].sa=t[rt<<1].sa+t[rt<<1|1].sa;
for(int i=0;i<=1;i++)
{
t[rt].l[i]=t[rt<<1].l[i];
if(i==1&&t[rt<<1].sa==t[rt<<1].len)
t[rt].l[1]=t[rt<<1].sa+t[rt<<1|1].l[1];
else if(i==0&&t[rt<<1].sa==0)
t[rt].l[0]=t[rt<<1].len+t[rt<<1|1].l[0];
t[rt].r[i]=t[rt<<1|1].r[i];
if(i==1&&t[rt<<1|1].sa==t[rt<<1|1].len)
t[rt].r[1]=t[rt<<1|1].sa+t[rt<<1].r[1];
else if(i==0&&t[rt<<1|1].sa==0)
t[rt].r[0]=t[rt<<1|1].len+t[rt<<1].r[0];
t[rt].a[i]=max(t[rt<<1].r[i]+t[rt<<1|1].l[i],max(t[rt<<1].a[i],t[rt<<1|1].a[i]));
}
}
inline void pd(ll rt,ll l,ll r)
{
if(t[rt].laz!=-1)
{
//cout<<23333<<" "<<l<<" "<<r<<" "<<t[rt].laz<<" "<<t[rt].sa<<endl;
t[rt].fa=0;
ll za=t[rt].laz;
t[rt<<1].sa=t[rt<<1].len*za,t[rt<<1|1].sa=t[rt<<1|1].len*za;
t[rt<<1].laz=t[rt<<1|1].laz=za;
t[rt<<1].fa=t[rt<<1|1].fa=0;
t[rt<<1].a[za]=t[rt<<1].l[za]=t[rt<<1].r[za]=t[rt<<1].len;
t[rt<<1].a[za^1]=t[rt<<1].l[za^1]=t[rt<<1].r[za^1]=0;
t[rt<<1|1].a[za]=t[rt<<1|1].l[za]=t[rt<<1|1].r[za]=t[rt<<1].len;
t[rt<<1|1].a[za^1]=t[rt<<1|1].l[za^1]=t[rt<<1|1].r[za^1]=0;
t[rt].laz=-1;
}
else if(t[rt].fa!=0)
{
t[rt<<1].sa=t[rt<<1].len-t[rt<<1].sa;
t[rt<<1|1].sa=t[rt<<1|1].len-t[rt<<1|1].sa;
if(t[rt<<1].laz!=-1)
t[rt<<1].laz^=1;
else
t[rt<<1].fa^=1;
if(t[rt<<1|1].laz!=-1)
t[rt<<1|1].laz^=1;
else
t[rt<<1|1].fa^=1;
swap(t[rt<<1].a[1],t[rt<<1].a[0]);
swap(t[rt<<1].l[1],t[rt<<1].l[0]);
swap(t[rt<<1].r[1],t[rt<<1].r[0]);
swap(t[rt<<1|1].a[1],t[rt<<1|1].a[0]);
swap(t[rt<<1|1].l[1],t[rt<<1|1].l[0]);
swap(t[rt<<1|1].r[1],t[rt<<1|1].r[0]);
t[rt].fa=0;
}
}
inline void build(ll rt,ll l,ll r)
{
t[rt].len=r-l+1,t[rt].laz=-1;
if(l==r)
{
t[rt].sa=w[l];
t[rt].a[1]=t[rt].l[1]=t[rt].r[1]=t[rt].sa==1;
t[rt].a[0]=t[rt].l[0]=t[rt].r[0]=t[rt].sa==0;
t[rt].fa=0,t[rt].laz=-1;
return ;
}
build(rson);
build(lson);
up1(rt);
return ;
}
inline void up(ll rt,ll l,ll r,ll L,ll R,ll x2)
{
pd(rt,l,r);
if(L<=l&&r<=R)
{
if(x2==1||x2==0)
{
t[rt].sa=t[rt].len*x2;
t[rt].laz=x2;
t[rt].a[x2]=t[rt].l[x2]=t[rt].r[x2]=t[rt].len;
t[rt].a[x2^1]=t[rt].l[rt]=t[rt].r[x2^1]=0;
}
else
{
t[rt].sa=t[rt].len-t[rt].sa;
t[rt].fa^=1;
swap(t[rt].a[1],t[rt].a[0]);
swap(t[rt].l[1],t[rt].l[0]);
swap(t[rt].r[1],t[rt].r[0]);
}
return ;
}
if(L<=mid)
up(lson,L,R,x2);
if(R>mid)
up(rson,L,R,x2);
up1(rt);
}
inline ll que(ll rt,ll l,ll r,ll L,ll R)
{
pd(rt,l,r);
if(l==L&&r==R)
return t[rt].sa;
else if(mid<L)
return que(rson,L,R);
else if(R<=mid)
return que(lson,L,R);
else
return que(lson,L,mid)+que(rson,mid+1,R);
}
inline tywl que1(ll rt,ll l,ll r,ll L,ll R)
{
pd(rt,l,r);
if(L==l&&r==R)
return t[rt];
if(R<=mid)
return que1(lson,L,R);
else if(L>mid)
return que1(rson,L,R);
else
{
tywl c,a=que1(lson,L,mid),b=que1(rson,mid+1,R);
c.sa=a.sa+b.sa;
for(int i=0;i<=1;i++)
{
c.l[i]=a.l[i];
if(i==1&&a.sa==a.len)
c.l[1]=a.sa+b.l[1];
else if(i==0&&a.sa==0)
c.l[0]=a.len+b.l[0];
c.r[i]=b.r[i];
if(i==1&&b.sa==b.len)
c.r[1]=b.sa+a.r[1];
else if(i==0&&b.sa==0)
c.r[0]=b.len+a.r[0];
c.a[i]=max(b.l[i]+a.r[i],max(a.a[i],b.a[i]));
//cout<<l<<" "<<r<<" "<<c.a[i]<<" "<<c.r[i]<<" "<<c.l[i]<<" "<<a.a[i]<<" "<<b.a[i]<<" "<<a.l[i]<<" "<<b.r[i]<<endl;
}
return c;
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
w[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++)
{
op=read(),x=read(),y=read();
x++,y++;
if(op==0)
up(1,1,n,x,y,0);
else if(op==1)
up(1,1,n,x,y,1);
else if(op==2)
up(1,1,n,x,y,2);
else if(op==3)
cout<<que(1,1,n,x,y)<<endl;
else if(op==4)
cout<<que1(1,1,n,x,y).a[1]<<endl;
}
}
by Purple_wzy @ 2020-11-10 23:31:56
再查查up函数吧,rt和x2貌似混了的说。。
by Purple_wzy @ 2020-11-10 23:32:20
@fly_me_2_the_moon
by fly_me_2_the_moon @ 2020-11-11 14:52:24
@Purple_wzy 谢谢dalao,已过