P2572求条
  • 板块灌水区
  • 楼主crz_qwq
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/9/10 22:14
  • 上次更新2024/9/11 15:50:35
查看原帖
P2572求条
795344
crz_qwq楼主2024/9/10 22:14

rt

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
struct node{
	int sum;
	int lx0,rx0,len0;
	int lx1,rx1,len1;
}tr[N<<2];
int tag[N<<2],rev[N<<2];
node pushup(node lc,node rc,int pl,int pr)
{
	int mid=(pl+pr)>>1;
	node res;
	res.sum=lc.sum+rc.sum;
	res.lx0=lc.lx0+rc.lx0*(mid-pl+1==lc.lx0);
	res.rx0=rc.rx0+lc.rx0*(pr-mid==rc.rx0);
	res.len0=max({lc.len0,rc.len0,lc.rx0+rc.lx0});
	res.lx1=lc.lx1+rc.lx1*(mid-pl+1==lc.lx1);
	res.rx1=rc.rx1+lc.rx1*(pr-mid==rc.rx1);
	res.len1=max({lc.len1,rc.len1,lc.rx1+rc.lx1});
	return res;
}
void addtag1(int p,int pl,int pr)
{
	rev[p]^=1;
	tr[p].sum=pr-pl+1-tr[p].sum;
	swap(tr[p].lx0,tr[p].lx1);
	swap(tr[p].rx0,tr[p].rx1);
	swap(tr[p].len0,tr[p].len1);
}
void addtag2(int p,int pl,int pr,int d)
{
	tag[p]=d;
	tr[p].sum=tr[p].lx1=tr[p].rx1=tr[p].len1=d*(pr-pl+1);
	tr[p].lx0=tr[p].rx0=tr[p].len0=(d^1)*(pr-pl+1);
}
void pushdown(int p,int pl,int pr)
{
	int mid=(pl+pr)>>1; 
	if(~tag[p])
	{
		addtag2(p<<1,pl,mid,tag[p]);
		addtag2(p<<1|1,mid+1,pr,tag[p]);
		tag[p]=-1;
	}
	if(rev[p])
	{
		addtag1(p<<1,pl,mid);
		addtag1(p<<1|1,mid+1,pr);
		rev[p]=0;		
	}
}
void build(int p,int pl,int pr)
{
	tag[p]=-1;
	rev[p]=0;
	if(pl==pr)
	{
		tr[p].sum=tr[p].lx1=tr[p].rx1=tr[p].len1=a[pl];
		tr[p].lx0=tr[p].rx0=tr[p].len0=a[pl]^1;
		return ; 
	}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid);
	build(p<<1|1,mid+1,pr);
	tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
}
void update1(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return ;
	if(L<=pl&&pr<=R)
	{
		addtag1(p,pl,pr);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update1(p<<1,pl,mid,L,R);
	update1(p<<1|1,mid+1,pr,L,R);
	tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
} 
void update2(int p,int pl,int pr,int L,int R,int d)
{
	if(R<pl||pr<L)
		return ;
	if(L<=pl&&pr<=R)
	{
		addtag2(p,pl,pr,d);
		return ;
	}
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	update2(p<<1,pl,mid,L,R,d);
	update2(p<<1|1,mid+1,pr,L,R,d);
	tr[p]=pushup(tr[p<<1],tr[p<<1|1],pl,pr);
}
node query(int p,int pl,int pr,int L,int R)
{
	if(R<pl||pr<L)
		return (node){0,0,0,0,0,0,0};
	if(L<=pl&&pr<=R)
		return tr[p]; 
	int mid=(pl+pr)>>1;
	pushdown(p,pl,pr);
	return pushup(query(p<<1,pl,mid,L,R),query(p<<1|1,mid+1,pr,L,R),pl,pr); 
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;++i)
		cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		int op,l,r;
		cin>>op>>l>>r;
		++l,++r;
		if(op==0)
			update2(1,1,n,l,r,0);
		if(op==1)
			update2(1,1,n,l,r,1);
		if(op==2)
			update1(1,1,n,l,r);
		if(op==3)
			cout<<query(1,1,n,l,r).sum<<'\n';
		if(op==4)
			cout<<query(1,1,n,l,r).len1<<'\n';
	 } 
}
2024/9/10 22:14
加载中...