比赛 2025暑期集训第2场 评测结果 AAAAAAAAAA
题目名称 序列操作 最终得分 100
用户昵称 左清源 运行时间 1.375 s
代码语言 C++ 内存使用 11.22 MiB
提交时间 2025-06-29 14:14:25
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
struct sgt{
	int sum[N<<2],len[N<<2];
	int dmax1[N<<2],lmax1[N<<2],rmax1[N<<2];
	int dmax0[N<<2],lmax0[N<<2],rmax0[N<<2];
	int tag1[N<<2],tag2[N<<2];
	int asum,amax,almax,armax,alen;
	#define ls (p<<1)
	#define rs (p<<1|1)
	void reset(){asum=amax=almax=armax=alen=0;}
	void updata(int p){
		if(!asum){
			asum=sum[p],amax=dmax1[p],almax=lmax1[p],armax=rmax1[p],alen=len[p];
		}else{
			amax=max(max(amax,dmax1[p]),armax+lmax1[p]);
			almax=(asum==alen)?(alen+lmax1[p]):almax;
			armax=(sum[p]==len[p])?(len[p]+armax):rmax1[p];
			asum+=sum[p],alen+=len[p];
		}
	}
	void build(int p,int l,int r){
		len[p]=r-l+1;tag2[p]=-1;
		if(l==r){
			if(a[l])sum[p]=dmax1[p]=lmax1[p]=rmax1[p]=1;
			else dmax0[p]=lmax0[p]=rmax0[p]=1;return;
		}
		int mid=(l+r)>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		push_up(p);return;
	}
	void push_up(int p){
		sum[p]=sum[ls]+sum[rs];
		dmax1[p]=max(max(dmax1[ls],dmax1[rs]),rmax1[ls]+lmax1[rs]);
		lmax1[p]=(sum[ls]==len[ls])?(len[ls]+lmax1[rs]):(lmax1[ls]);
		rmax1[p]=(sum[rs]==len[rs])?(len[rs]+rmax1[ls]):(rmax1[rs]);
		dmax0[p]=max(max(dmax0[ls],dmax0[rs]),rmax0[ls]+lmax0[rs]);
		lmax0[p]=(sum[ls])?(lmax0[ls]):(len[ls]+lmax0[rs]);
		rmax0[p]=(sum[rs])?(rmax0[rs]):(len[rs]+rmax0[ls]);
		return;
	} 
	void make_tag2(int p,int v){
		tag1[p]=0;tag2[p]=v;
		if(v){
			sum[p]=len[p];
			dmax1[p]=lmax1[p]=rmax1[p]=len[p];
			dmax0[p]=lmax0[p]=rmax0[p]=0;
		}else{
			sum[p]=0;
			dmax0[p]=lmax0[p]=rmax0[p]=len[p];
			dmax1[p]=lmax1[p]=rmax1[p]=0;
		} 
		return;
	}
	void make_tag1(int p){
		if(tag2[p]!=-1){
			make_tag2(p,!tag2[p]);
		}else{
			tag1[p]^=1;
			sum[p]=len[p]-sum[p];
			swap(dmax0[p],dmax1[p]);
			swap(lmax0[p],lmax1[p]);
			swap(rmax0[p],rmax1[p]);
		}
		return;
	}
	void push_down(int p){
		if(tag2[p]!=-1)make_tag2(ls,tag2[p]),make_tag2(rs,tag2[p]),tag2[p]=-1;
		if(tag1[p])make_tag1(ls),make_tag1(rs),tag1[p]=0;
		return;
	}
	void assign(int p,int l,int r,int L,int R,int v){
		if(L<=l&&r<=R){
			make_tag2(p,v);
			return;
		}else{
			int mid=(l+r)>>1;push_down(p);
			if(L<=mid)assign(ls,l,mid,L,R,v);
			if(R>mid)assign(rs,mid+1,r,L,R,v);
			push_up(p);return;
		}
	}
	void reverse(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R){
			make_tag1(p);
			return;
		}else{
			int mid=(l+r)>>1;push_down(p);
			if(L<=mid)reverse(ls,l,mid,L,R);
			if(R>mid)reverse(rs,mid+1,r,L,R);
			push_up(p);return;
		}
	}
	int ask(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R)return sum[p];
		int mid=(l+r)>>1,cnt=0;push_down(p);
		if(L<=mid)cnt+=ask(ls,l,mid,L,R);
		if(R>mid)cnt+=ask(rs,mid+1,r,L,R);
		return cnt;
	}
	void query(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R){updata(p);return;}
		int mid=(l+r)>>1;push_down(p);
		if(L<=mid)query(ls,l,mid,L,R);
		if(R>mid)query(rs,mid+1,r,L,R);
		return;
	}
}tr;
int main(){
	freopen("sequence.in","r",stdin);
	freopen("sequence.out","w",stdout); 
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	tr.build(1,1,n);
	while(m--){
		int o,x,y;
		scanf("%d %d %d",&o,&x,&y);
		x++,y++;
		if(o==0)tr.assign(1,1,n,x,y,0);
		if(o==1)tr.assign(1,1,n,x,y,1);
		if(o==2)tr.reverse(1,1,n,x,y);
		if(o==3)printf("%d\n",tr.ask(1,1,n,x,y));
		if(o==4){
			tr.reset();
			tr.query(1,1,n,x,y);
			printf("%d\n",tr.amax); 
		}
	} 
	return 0;
}