10pts救救孩子吧
查看原帖
10pts救救孩子吧
258332
fly_me_2_the_moon楼主2020/11/10 22:29
#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;		
	}
}
2020/11/10 22:29
加载中...