样例没过,玄关
查看原帖
样例没过,玄关
786605
xgw120121楼主2024/7/7 13:30
#include<bits/stdc++.h>
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,m,opt,x,y;
int a[100010];
struct node
{
	int sum,lazy,rev;
	int ans[5],l[5],r[5];
}t[100010<<2];
void pushup(int id,int l,int r)
{
	int mid=l+r>>1;
	t[id].sum=t[ls].sum+t[rs].sum;
	for(int i=0;i<=1;i++)
	{
		t[id].l[i]=t[ls].l[i];t[id].r[i]=t[rs].r[i];
		if(i==1&&t[ls].sum==mid-l+1) t[id].l[i]+=t[rs].l[i];
		if(i==0&&t[ls].sum==0) t[id].l[i]+=t[rs].l[i];
		if(i==1&&t[rs].sum==r-mid) t[id].r[i]+=t[ls].r[i];
		if(i==0&&t[rs].sum==0) t[id].r[i]+=t[ls].r[i];
		t[id].ans[i]=max(t[ls].ans[i],t[rs].ans[i]);
		t[id].ans[i]=max(t[id].ans[i],t[ls].r[i]+t[rs].l[i]);
	}
}
void pushdown(int id,int l,int r)
{
	int mid=l+r>>1;
	if(t[id].lazy!=-1)
	{
		t[id].rev=0;
		int tag=t[id].lazy;
		t[ls].sum=(mid-l+1)*tag;
		t[rs].sum=(r-mid)*tag;
		t[ls].lazy=t[rs].lazy=tag;
		t[ls].rev=t[rs].rev=0;
		t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=(mid-l+1);
		t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=(r-mid);
		tag^=1;
		t[ls].ans[tag]=t[ls].l[tag]=t[ls].r[tag]=0;
		t[rs].ans[tag]=t[rs].l[tag]=t[rs].r[tag]=0;
		tag^=1;
		t[id].lazy=-1;
	}
	if(t[id].rev)
	{
		t[ls].sum=mid-l+r-t[ls].sum;
		t[rs].sum=r-mid-t[rs].sum;
		if(t[ls].lazy!=-1) t[ls].lazy^=1;
		if(t[rs].lazy!=-1) t[rs].lazy^=1;
		swap(t[ls].ans[0],t[ls].ans[1]);
		swap(t[ls].l[0],t[ls].l[1]);
		swap(t[ls].r[0],t[ls].r[1]);
		swap(t[rs].ans[0],t[rs].ans[1]);
		swap(t[rs].l[0],t[rs].l[1]);
		swap(t[rs].r[0],t[rs].r[1]);
		t[id].rev=0;
	}
}
void build(int id,int l,int r)
{
	t[id].lazy=-1;
	if(l==r)
	{
		cin>>a[l];
		t[id].sum=(a[l]==1);
		t[id].ans[0]=t[id].l[0]=t[id].r[0]=(a[l]==0);
		t[id].ans[1]=t[id].l[1]=t[id].r[1]=(a[l]==1);
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);build(rs,mid+1,r);
	pushup(id,l,r);
}
void update(int id,int l,int r)
{
	pushdown(id,l,r);
	if(x<=l&&r<=y)
	{
		if(opt<=1)
	    {
	    	t[id].sum=(r-l+1)*opt;
	    	t[id].lazy=opt;
	    	t[id].ans[0]=t[id].l[0]=t[id].r[0]=(r-l+1)*(opt==0);
	    	t[id].ans[1]=t[id].l[1]=t[id].r[1]=(r-l+1)*(opt==1);
		}
		else
		{
			t[id].sum=(r-l+1)-t[id].sum;
			t[id].rev^=1;
			swap(t[id].ans[0],t[id].ans[1]);swap(t[id].l[0],t[id].l[1]);swap(t[id].r[0],t[id].r[1]);
		}
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) update(ls,l,mid);
	if(mid+1<=y) update(rs,mid+1,r);
	pushup(id,l,r);
}
int query_sum(int id,int l,int r)
{
	pushdown(id,l,r);
	if(x<=l&&r<=y) return t[id].sum;
	int mid=l+r>>1,ans=0;
	if(x<=mid) ans+=query_sum(ls,l,mid);
	if(mid+1<=y) ans+=query_sum(rs,mid+1,r);
//	pushup(id,l,r);
	return ans;
}
node query_tree(int id,int l,int r)
{
	pushdown(id,l,r);
	if(x<=l&&r<=y) return t[id];
	int mid=l+r>>1;
	if(y<=mid) return query_tree(ls,l,mid);
	  else if(mid+1<=x) return query_tree(rs,mid+1,r);
	    else
		{
		    node tree,lt=query_tree(ls,l,mid),rt=query_tree(rs,mid+1,r);
			for(int i=0;i<=1;i++)
			{
				tree.l[i]=lt.l[i];tree.r[i]=rt.r[i];
				if(i==1&&lt.sum==mid-l+1) tree.l[i]+=rt.l[i];
				if(i==0&&lt.sum==0) tree.l[i]+=rt.l[i];
				if(i==1&&rt.sum==r-mid) tree.r[i]+=lt.r[i];
				if(i==0&&rt.sum==0) tree.r[i]+=lt.r[i];
				tree.ans[i]=max(lt.ans[i],rt.ans[i]);
				tree.ans[i]=max(tree.ans[i],lt.r[i]+rt.l[i]);
			}	
			return tree;
		} 
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	build(1,1,n);
	while(m--)
	{
		cin>>opt>>x>>y;
		if(opt<=2) update(1,1,n);
		  else if(opt==3) cout<<query_sum(1,1,n)<<'\n';
		    else cout<<query_tree(1,1,n).ans[1]<<'\n';
	}
}
2024/7/7 13:30
加载中...