求调 玄关
查看原帖
求调 玄关
822979
CowboyStyle楼主2023/11/29 19:57
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+15;
struct tree{
	int l,r;
	bool f0,f1,f;
	int l1,r1,n1;
	int l0,r0,n0;
	int sum;
}a[N*4];
int ls(int u)
{
	return u<<1;
}
int rs(int u)
{
	return u<<1|1;
}
int fmid(int x,int y)
{
	return x+y>>1;
 } 
void pushup(int u)
{
	a[u].sum=a[ls(u)].sum+a[rs(u)].sum; 
	a[u].l1=a[ls(u)].l1;
	a[u].l0=a[ls(u)].l0;
	a[u].r1=a[rs(u)].r1;
	a[u].r0=a[rs(u)].r0;
	if(a[ls(u)].sum==(a[ls(u)].r-a[ls(u)].l+1))
	{
		a[u].l1+=a[rs(u)].l1;
	}
	else if(a[ls(u)].sum==0)
	{
		a[u].l0+=a[rs(u)].l0;
	}
	if(a[rs(u)].sum==a[rs(u)].r-a[rs(u)].l+1)
	{
		a[u].r1+=a[ls(u)].r1;
	}
	else if(a[rs(u)].sum==0)
	{
		a[u].r0+=a[ls(u)].r0;
	}
	a[u].n1=a[ls(u)].r1+a[rs(u)].l1;
	a[u].n1=max(a[u].n1,a[ls(u)].n1);
	a[u].n1=max(a[u].n1,a[rs(u)].n1);
	a[u].n0=a[ls(u)].r0+a[rs(u)].l0;
	a[u].n0=max(a[u].n0,a[ls(u)].n0);
	a[u].n0=max(a[u].n0,a[rs(u)].n0);
}
void pushdown(int u)
{
	if(a[u].f0)
	{
		a[u].f=0;
		
		a[ls(u)].n0
		=a[ls(u)].r0
		=a[ls(u)].l0
		=a[ls(u)].r-a[ls(u)].l+1;
		
		a[rs(u)].n0
		=a[rs(u)].r0
		=a[rs(u)].l0
		=a[rs(u)].r-a[rs(u)].l+1;
		
		a[ls(u)].n1
		=a[ls(u)].r1
		=a[ls(u)].l1
		=0;
		
		a[rs(u)].n1
		=a[rs(u)].r1
		=a[rs(u)].l1
		=0;
		
		a[ls(u)].f0=a[rs(u)].f0=1;
		a[ls(u)].sum=a[rs(u)].sum=0;
		a[u].f0=0;
	}
	else
	if(a[u].f1)
	{
		a[u].f=0;
		
		a[ls(u)].n0
		=a[ls(u)].r0
		=a[ls(u)].l0
		=0;
		
		a[rs(u)].n0
		=a[rs(u)].r0
		=a[rs(u)].l0
		=0;
		
		a[ls(u)].n1
		=a[ls(u)].r1
		=a[ls(u)].l1
		=a[ls(u)].r-a[ls(u)].l+1;
		
		a[rs(u)].n1
		=a[rs(u)].r1
		=a[rs(u)].l1
		=a[rs(u)].r-a[rs(u)].l+1;
		
		a[ls(u)].f1=a[rs(u)].f1=1;
		a[ls(u)].sum=a[ls(u)].r-a[ls(u)].l+1;
		a[rs(u)].sum=a[rs(u)].r-a[rs(u)].l+1;
		a[u].f1=0;
	}
	else
	if(a[u].f)
	{ 
		a[ls(u)].sum=a[ls(u)].r-a[ls(u)].l+1-a[ls(u)].sum;
		a[rs(u)].sum=a[rs(u)].r-a[rs(u)].l+1-a[rs(u)].sum;
		if(a[ls(u)].f1==1||a[ls(u)].f0==1)
		{
			a[ls(u)].f1=a[ls(u)].f1^1;
			a[ls(u)].f0=a[ls(u)].f0^1;
		}
		else
		a[ls(u)].f=a[ls(u)].f^1;
		
		if(a[rs(u)].f1==1||a[rs(u)].f0==1)
		{
			a[rs(u)].f1=a[rs(u)].f1^1;
			a[rs(u)].f0=a[rs(u)].f0^1;
		}
		else
		a[rs(u)].f=a[rs(u)].f^1;
		
		swap(a[ls(u)].l1,a[ls(u)].l0);
		swap(a[ls(u)].r1,a[ls(u)].r0);
		swap(a[ls(u)].n1,a[ls(u)].n0);
		swap(a[rs(u)].l1,a[rs(u)].l0);
		swap(a[rs(u)].r1,a[rs(u)].r0);
		swap(a[rs(u)].n1,a[rs(u)].n0);
		a[u].f=0;
	}
}
void build(int u,int l,int r)
{
	a[u].l=l;
	a[u].r=r;
	a[u].f=a[u].f1=a[u].f0=0; 
	if(l==r)
	{
		scanf("%d",&a[u].sum);
		if(a[u].sum==0)
		a[u].n0=a[u].l0=a[u].r0=1;
		else
		a[u].n1=a[u].l1=a[u].r1=1;
		return ; 
	}
	int mid=fmid(l,r);
	build(ls(u),l,mid);
	build(rs(u),mid+1,r);
	pushup(u);
}
void chance(int u,int l,int r,int x)
{
	pushdown(u);
	if(a[u].l>=l&&a[u].r<=r)
	{
		if(x==0)
		{
			a[u].f1=0;
			a[u].sum=0;
			a[u].n0=a[u].r0=a[u].l0=a[u].r-a[u].l+1;
			a[u].n1=a[u].l1=a[u].r1=0;
			a[u].f0=1;
		}
		if(x==1)
		{
			a[u].f0=0;
			a[u].sum=a[u].r-a[u].l+1;
			a[u].n1=a[u].r1=a[u].l1=a[u].r-a[u].l+1;
			a[u].n0=a[u].l0=a[u].r0=0;
			a[u].f1=1;
		}
		if(x==2)
		{
			a[u].sum=a[u].r-a[u].l+1-a[u].sum;
			swap(a[u].l1,a[u].l0);
			swap(a[u].r1,a[u].r0);
			swap(a[u].n1,a[u].n0);
			a[u].f=a[u].f^1;
		}
		return ;	
    }
		int mid=fmid(a[u].l,a[u].r);
		if(l<=mid)
		chance(ls(u),l,r,x);
		if(r>mid)
		chance(rs(u),l,r,x);
		pushup(u);
}
int ask1(int u,int l,int r)
{
	if(a[u].l>=l&&a[u].r<=r)
	{
		return a[u].sum;
	}
	pushdown(u);
	int mid=fmid(a[u].l,a[u].r),ans=0;
	if(l<=mid)
	{
		ans+=ask1(ls(u),l,r);
	}
	if(r>mid)
	{
		ans+=ask1(rs(u),l,r);
	}
	return ans;
}
tree ask2(int u,int l,int r)
{
	if(a[u].l>=l&&a[u].r<=r)
	{
		return a[u];
	}
	pushdown(u);
	int mid=fmid(a[u].l,a[u].r);
	if(r<=mid)
	return ask2(ls(u),l,r);
	if(l>mid)
	return ask2(rs(u),l,r);
		tree x=ask2(ls(u),l,r),y=ask2(rs(u),l,r),nw;
		nw.sum=x.sum+y.sum; 
		nw.l1=x.l1;
		nw.l0=x.l0;
		nw.r1=y.r1;
		nw.r0=y.r0;
		if(x.sum==(x.r-x.l+1))
		{
			nw.l1+=y.l1;
		}
		else if(x.sum==0)
		{
			nw.l0+=y.l0;
		}
		if(y.sum==y.r-y.l+1)
		{
			nw.r1+=x.r1;
		}
		else if(y.sum==0)
		{
			nw.r0+=x.r0;
		}
		nw.n1=x.r1+y.l1;
		nw.n1=max(nw.n1,x.n1);
		nw.n1=max(nw.n1,y.n1);
		nw.n0=x.r0+y.l0;
		nw.n0=max(nw.n0,x.n0);
		nw.n0=max(nw.n0,y.n0);
        return nw;
}
int n,m; 
int main()
{
	scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,l,r;
		scanf("%d%d%d",&op,&l,&r);
		l++,r++;
		if(op==0||op==1||op==2)
		{
			chance(1,l,r,op);
		}
		if(op==3)
		{
			printf("%d\n",ask1(1,l,r));
		}
		if(op==4)
		{
			tree ans=ask2(1,l,r);
			printf("%d\n",ans.n1);
		}
	}
	return 0;
  }  
2023/11/29 19:57
加载中...