记录编号 602641 评测结果 AAAAAAAAAA
题目名称 2083.[SCOI2010]序列操作 最终得分 100
用户昵称 Gravatar秋_Water 是否通过 通过
代码语言 C++ 运行时间 2.175 s
提交时间 2025-07-04 22:03:23 内存使用 10.90 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node{
	int l,r,sum1,max1,max0,lmax1,lmax0,rmax1,rmax0,len,add0,add1,add3;
}t[N];
int a[N],cnt,n,m,root;
void update(int p){
	t[p].sum1=t[t[p].l].sum1+t[t[p].r].sum1;
	if(t[t[p].l].max1==t[t[p].l].len) t[p].lmax1=t[t[p].l].len+t[t[p].r].lmax1;
	else t[p].lmax1=t[t[p].l].lmax1;
	if(t[t[p].r].max1==t[t[p].r].len) t[p].rmax1=t[t[p].r].len+t[t[p].l].rmax1;
	else t[p].rmax1=t[t[p].r].rmax1;
	t[p].max1=max(max(t[t[p].l].max1,t[t[p].r].max1),t[t[p].l].rmax1+t[t[p].r].lmax1);
	
	if(t[t[p].l].max0==t[t[p].l].len) t[p].lmax0=t[t[p].l].len+t[t[p].r].lmax0;
	else t[p].lmax0=t[t[p].l].lmax0;
	if(t[t[p].r].max0==t[t[p].r].len) t[p].rmax0=t[t[p].r].len+t[t[p].l].rmax0;
	else t[p].rmax0=t[t[p].r].rmax0;
	t[p].max0=max(max(t[t[p].l].max0,t[t[p].r].max0),t[t[p].l].rmax0+t[t[p].r].lmax0);
}
void pushdown(int p){
	if(t[p].add0){
		t[t[p].l].sum1=t[t[p].l].max1=t[t[p].l].lmax1=t[t[p].l].rmax1=0;
		t[t[p].l].max0=t[t[p].l].lmax0=t[t[p].l].rmax0=t[t[p].l].len;
		t[t[p].l].add0=1;
		t[t[p].l].add1=0;		
		t[t[p].l].add3=0;	
		t[t[p].r].sum1=t[t[p].r].max1=t[t[p].r].lmax1=t[t[p].r].rmax1=0;
		t[t[p].r].max0=t[t[p].r].lmax0=t[t[p].r].rmax0=t[t[p].r].len;
		t[t[p].r].add0=1;
		t[t[p].r].add1=0;	
		t[t[p].r].add3=0;
		t[p].add0=0;
	}
	if(t[p].add1){
		t[t[p].l].sum1=t[t[p].l].max1=t[t[p].l].lmax1=t[t[p].l].rmax1=t[t[p].l].len;
		t[t[p].l].max0=t[t[p].l].lmax0=t[t[p].l].rmax0=0;
		t[t[p].l].add0=0;
		t[t[p].l].add1=1;		
		t[t[p].l].add3=0;	
		t[t[p].r].sum1=t[t[p].r].max1=t[t[p].r].lmax1=t[t[p].r].rmax1=t[t[p].r].len;
		t[t[p].r].max0=t[t[p].r].lmax0=t[t[p].r].rmax0=0;
		t[t[p].r].add0=0;
		t[t[p].r].add1=1;	
		t[t[p].r].add3=0;	
		t[p].add1=0;	
	}
	if(t[p].add3){
		t[t[p].l].sum1=t[t[p].l].len-t[t[p].l].sum1;
		swap(t[t[p].l].max1,t[t[p].l].max0);
		swap(t[t[p].l].lmax1,t[t[p].l].lmax0);
		swap(t[t[p].l].rmax1,t[t[p].l].rmax0);
		swap(t[t[p].l].add0,t[t[p].l].add1);
		if(t[t[p].l].add0==0&&t[t[p].l].add1==0){
			t[t[p].l].add3^=1;
		}
		t[t[p].r].sum1=t[t[p].r].len-t[t[p].r].sum1;
		swap(t[t[p].r].max1,t[t[p].r].max0);
		swap(t[t[p].r].lmax1,t[t[p].r].lmax0);
		swap(t[t[p].r].rmax1,t[t[p].r].rmax0);
		swap(t[t[p].r].add0,t[t[p].r].add1);
		if(t[t[p].r].add0==0&&t[t[p].r].add1==0){
			t[t[p].r].add3^=1;
		}		
		t[p].add3=0;
	}
}
void build(int &p,int l,int r){
	p=++cnt;
	t[p].len=(r-l+1);
	if(l==r){
		t[p].sum1=a[l];
		t[p].max1=a[l];
		t[p].max0=a[l]^1;
		t[p].lmax1=a[l];
		t[p].lmax0=a[l]^1;		
		t[p].rmax1=a[l];
		t[p].rmax0=a[l]^1;	
		return; 
	}
	int mid=l+r>>1;
	build(t[p].l,l,mid);
	build(t[p].r,mid+1,r);
	update(p);
}
void change1(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql){
		return;
	} 
	if(ql<=l&&r<=qr){
		t[p].sum1=t[p].max1=t[p].lmax1=t[p].rmax1=0;
		t[p].max0=t[p].lmax0=t[p].rmax0=t[p].len;
		t[p].add0=1;
		t[p].add1=0;
		t[p].add3=0;
		return;
	}
	pushdown(p);
	int mid=l+r>>1;
	change1(t[p].l,l,mid,ql,qr);
	change1(t[p].r,mid+1,r,ql,qr);
	update(p);
}
void change2(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql){
		return;
	} 
	if(ql<=l&&r<=qr){
		t[p].sum1=t[p].max1=t[p].lmax1=t[p].rmax1=t[p].len;
		t[p].max0=t[p].lmax0=t[p].rmax0=0;
		t[p].add0=0;
		t[p].add1=1;
		t[p].add3=0;
		return;
	}
	pushdown(p);
	int mid=l+r>>1;
	change2(t[p].l,l,mid,ql,qr);
	change2(t[p].r,mid+1,r,ql,qr);
	update(p);
}
void change3(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql){
		return;
	} 
	if(ql<=l&&r<=qr){
		t[p].sum1=t[p].len-t[p].sum1;
		swap(t[p].max1,t[p].max0);
		swap(t[p].lmax1,t[p].lmax0);
		swap(t[p].rmax1,t[p].rmax0);
		swap(t[p].add0,t[p].add1);
		if(t[p].add0==0&&t[p].add1==0){
			t[p].add3^=1;
		}
		return;
	}
	pushdown(p);
	int mid=l+r>>1;
	change3(t[p].l,l,mid,ql,qr);
	change3(t[p].r,mid+1,r,ql,qr);
	update(p);	
}
int query1(int p,int l,int r,int ql,int qr){
	if(l>qr||r<ql){
		return 0;
	} 
	if(ql<=l&&r<=qr){
		return t[p].sum1;
	}
	pushdown(p);
	int mid=l+r>>1;
	return query1(t[p].l,l,mid,ql,qr)+query1(t[p].r,mid+1,r,ql,qr);
}
int query2(int p,int l,int r,int ql,int qr){
	if(ql<=l&&r<=qr){
		return t[p].max1;
	}
	pushdown(p);
	int mid=l+r>>1;
	if(qr<=mid){
		return query2(t[p].l,l,mid,ql,qr); 
	}
	else if(ql>mid){
		return query2(t[p].r,mid+1,r,ql,qr); 
	}
	else{
		int v1=query2(t[p].l,l,mid,ql,mid);
		int v2=query2(t[p].r,mid+1,r,mid+1,qr);
		int v3=min(t[t[p].l].rmax1,mid-ql+1)+min(t[t[p].r].lmax1,qr-mid); 
		return max(max(v1,v2),v3);
	} 
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(root,1,n);
	for(int i=1;i<=m;i++){
		int op,l,r;
		cin>>op>>l>>r;
		l++,r++;
		if(op==0){
			change1(root,1,n,l,r);
		} 
		else if(op==1){
			change2(root,1,n,l,r);
		}
		else if(op==2){
			change3(root,1,n,l,r);
		}
		else if(op==3){
			cout<<query1(root,1,n,l,r)<<"\n";
		}
		else{
			cout<<query2(root,1,n,l,r)<<"\n";
		}
	}

	return 0;
}