线段树样例过不了,大佬求调
查看原帖
线段树样例过不了,大佬求调
877691
MorLeaves楼主2024/5/8 18:03
#include<iostream>
#include<cstdio>
#define ls p<<1
#define rs p<<1|1
const int N=114514;
using namespace std;
int n,m,a[N],op,x,y;
struct node {
	int l,r,sum,tag1,tag2,lmax1,rmax1,lmax0,rmax0,max1,max0,len;
}tr[N<<2];
void push_up(int p)
{
	tr[p].sum=tr[ls].sum+tr[rs].sum;
	tr[p].lmax1=(tr[ls].sum==tr[ls].len)?tr[ls].sum+tr[rs].lmax1:tr[ls].lmax1;
	tr[p].rmax1=(tr[rs].sum==tr[rs].len)?tr[rs].sum+tr[ls].rmax1:tr[rs].rmax1;
	tr[p].lmax0=(tr[ls].max0==tr[ls].len)?tr[ls].len+tr[rs].lmax0:tr[ls].lmax0;
	tr[p].rmax0=(tr[rs].max0==tr[rs].len)?tr[rs].len+tr[ls].rmax0:tr[rs].rmax0;
	tr[p].max1=max(tr[ls].rmax1+tr[rs].lmax1,max(tr[ls].max1,tr[rs].max1));
	tr[p].max0=max(tr[ls].rmax0+tr[rs].lmax0,max(tr[ls].max0,tr[rs].max0));
}
void push_down(int p)
{
	if (tr[p].tag1)
	{
		tr[ls].sum=tr[ls].lmax1=tr[ls].rmax1=tr[ls].max1=tr[ls].len*(tr[p].tag1-1);
		tr[ls].lmax0=tr[ls].rmax0=tr[ls].max0=tr[ls].len*((tr[p].tag1-1)^1);
		tr[ls].tag1=tr[p].tag1;
		tr[rs].sum=tr[rs].lmax1=tr[rs].rmax1=tr[rs].max1=tr[rs].len*(tr[p].tag1-1);
		tr[rs].lmax0=tr[rs].rmax0=tr[rs].max0=tr[rs].len*((tr[p].tag1-1)^1);
		tr[rs].tag1=tr[p].tag1;
		tr[p].tag1=tr[ls].tag2=tr[rs].tag2=0;
	}
	if (tr[p].tag2)
	{
		tr[ls].sum=tr[ls].len-tr[ls].sum;
		swap(tr[ls].lmax1,tr[ls].lmax0);
		swap(tr[ls].rmax1,tr[ls].rmax0);
		swap(tr[ls].max1,tr[ls].max0);
		if (tr[ls].tag1==1)
		{
			tr[ls].tag1=2;
		}
		else if (tr[ls].tag1==2)
		{
			tr[ls].tag1=1;
		}
		else
		{
			tr[ls].tag2^=1;
		}
		tr[rs].sum=tr[rs].len-tr[rs].sum;
		swap(tr[rs].lmax1,tr[rs].lmax0);
		swap(tr[rs].rmax1,tr[rs].rmax0);
		swap(tr[rs].max1,tr[rs].max0);
		if (tr[rs].tag1==1)
		{
			tr[rs].tag1=2;
		}
		else if (tr[rs].tag1==2)
		{
			tr[rs].tag1=1;
		}
		else
		{
			tr[rs].tag2^=1;
		}
		tr[p].tag2=0;
	}
}
void build(int s,int t,int p)
{
	tr[p].l=s;
	tr[p].r=t;
	tr[p].len=t-s+1;
	if (s==t)
	{
		tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=a[s];
		tr[p].lmax0=tr[p].rmax0=tr[p].max0=(a[s]^1);
		return ;
	}
	int mid=s+((t-s)>>1);
	build(s,mid,ls);
	build(mid+1,t,rs);
	push_up(p);
}
void upd1(int s,int t,int p)
{
	if (s<=tr[p].l&&tr[p].r<=t)
	{
		tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=0;
		tr[p].lmax0=tr[p].rmax0=tr[p].max0=tr[p].len;
		tr[p].tag1=1;
		tr[p].tag2=0;
		return ;
	}
	push_down(p);
	int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
	if (s<=mid)
	{
		upd1(s,t,ls);
	}
	if (t>mid)
	{
		upd1(s,t,rs);
	}
	push_up(p);
}
void upd2(int s,int t,int p)
{
	if (s<=tr[p].l&&tr[p].r<=t)
	{
		tr[p].sum=tr[p].lmax1=tr[p].rmax1=tr[p].max1=tr[p].len;
		tr[p].lmax0=tr[p].rmax0=tr[p].max0=0;
		tr[p].tag1=2;
		tr[p].tag2=0;
		return ;
	}
	push_down(p);
	int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
	if (s<=mid)
	{
		upd2(s,t,ls);
	}
	if (t>mid)
	{
		upd2(s,t,rs);
	}
	push_up(p);
}
void upd3(int s,int t,int p)
{
	if (s<=tr[p].l&&tr[p].r<=t)
	{
		tr[p].sum=tr[p].len-tr[p].sum;
		swap(tr[p].lmax1,tr[p].lmax0);
		swap(tr[p].rmax1,tr[p].rmax0);
		swap(tr[p].max1,tr[p].max0);
		if (tr[p].tag1==1)
		{
			tr[p].tag1=2;
		}
		else if (tr[p].tag1==2)
		{
			tr[p].tag1=1;
		}
		else
		{
			tr[p].tag2=!tr[p].tag2;
		}
		return ;
	}
	push_down(p);
	int mid=tr[p].l+((tr[p].r-tr[p].l)>>1);
	if (s<=mid)
	{
		upd3(s,t,ls);
	}
	if (t>mid)
	{
		upd3(s,t,rs);
	}
	push_up(p);
}
int getsum(int s,int t,int p)
{
	if (s<=tr[p].l&&tr[p].r<=t)
	{
		return tr[p].sum;
	}
	push_down(p);
	int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=0;
	if (s<=mid)
	{
		ans+=getsum(s,t,ls);
	}
	if (t>mid)
	{
		ans+=getsum(s,t,rs);
	}
	return ans;
}
int getmaxn(int s,int t,int p)
{
	if (s<=tr[p].l&&tr[p].r<=t)
	{
		return tr[p].max1;
	}
	push_down(p);
	int mid=tr[p].l+((tr[p].r-tr[p].l)>>1),ans=-2147483647;
	if (s<=mid)
	{
		ans=max(ans,getmaxn(s,t,ls));
	}
	if (t>mid)
	{
		ans=max(ans,getmaxn(s,t,rs));
	}
	return ans;
}
int main()
{
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	while(m--)
	{
		scanf("%d %d %d",&op,&x,&y);
		x++,y++;
		if (op==0)
		{
			upd1(x,y,1);
		}
		else if (op==1)
		{
			upd2(x,y,1);
		}
		else if (op==2)
		{
			upd3(x,y,1);
		}
		else if (op==3)
		{
			printf("%d\n",getsum(x,y,1));
		}
		else
		{
			printf("%d\n",getmaxn(x,y,1));
		}
	}
	return 0;
}
2024/5/8 18:03
加载中...