50pts 求条(悬3关)
查看原帖
50pts 求条(悬3关)
1273684
_std_O2楼主2025/1/21 11:29
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
const int M=1e4;
int L[M],R[M],pos[N],a[N],ans[M],n,m,t,L_1[M],L_0[M],R_1[M],R_0[M],MAX_1[M],MAX_0[M];
bool tag[M];
void solve1(int p){
	int cnt_1=0,cnt_0=0;
	MAX_1[p]=MAX_0[p]=0;
	for(int i=L[p];i<=R[p];i++){
		if((a[i]^tag[p])==1){
			cnt_1++;
			cnt_0=0;
			MAX_1[p]=max(MAX_1[p],cnt_1);
		} 
		if((a[i]^tag[p])==0){
			cnt_0++;
			cnt_1=0;
			MAX_0[p]=max(MAX_0[p],cnt_0);
		}
	}
}


void solve2(int p){
	int cnt=0;
	for(int i=L[p];i<=R[p];i++){
		if((a[i]^tag[p])==1) cnt++;
		else break;
	}
	L_1[p]=cnt;cnt=0;
	for(int i=L[p];i<=R[p];i++){
		if((a[i]^tag[p])==0) cnt++;
		else break;
	}
	L_0[p]=cnt;cnt=0;
	for(int i=R[p];i>=L[p];i--){
		if((a[i]^tag[p])==1) cnt++;
		else break;
	}
	R_1[p]=cnt;cnt=0;
	for(int i=R[p];i>=L[p];i--){
		if((a[i]^tag[p])==0) cnt++;
		else break;
	}
	R_0[p]=cnt;cnt=0;
}

void cg0(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			if(a[i]^tag[q]) ans[q]-=1;
			if(!tag[q]) a[i]=0;
			if(tag[q]) a[i]=1;
		}
		solve1(p),solve2(p);
	}
	else{
		for(int i=p+1;i<=q-1;i++){
			ans[i]=0;
			L_0[i]=R_0[i]=MAX_0[i]=R[i]-L[i]+1;
			L_1[i]=R_1[i]=MAX_1[i]=0;
			tag[i]=0;
			for(int j=L[i];j<=R[i];j++) a[j]=0;
		}
		for(int i=l;i<=R[p];i++){
			if(a[i]^tag[p]) ans[p]-=1;
			if(!tag[p]) a[i]=0;
			if(tag[p]) a[i]=1;
		}
		solve1(p),solve2(p);
		for(int i=L[q];i<=r;i++){
			if(a[i]^tag[q]) ans[q]-=1;
			if(!tag[q]) a[i]=0;
			if(tag[q]) a[i]=1;
		}
		solve1(q),solve2(q);
	}
}

void cg1(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			if(!(a[i]^tag[q])) ans[q]+=1;
			if(!tag[q]) a[i]=1;
			if(tag[q]) a[i]=0;
		}
		solve1(p),solve2(p);
	}
	else{
		for(int i=p+1;i<=q-1;i++){
			ans[i]=R[i]-L[i]+1;
			L_1[i]=R_1[i]=MAX_1[i]=R[i]-L[i]+1;
			L_0[i]=R_0[i]=MAX_0[i]=0;
			tag[i]=0;
			for(int j=L[i];j<=R[i];j++) a[j]=1;
		}
		for(int i=l;i<=R[p];i++){
			if(!(a[i]^tag[p])) ans[p]+=1;
			if(!tag[p]) a[i]=1;
			if(tag[p]) a[i]=0;
		}
		solve1(p),solve2(p);
		for(int i=L[q];i<=r;i++){
			if(!(a[i]^tag[q])) ans[q]+=1;
			if(!tag[q]) a[i]=1;
			if(tag[q]) a[i]=0;
		}
		solve1(q),solve2(q);
	}
}

void cg2(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		for(int i=l;i<=r;i++){
			int nw=a[i]^tag[q];
			ans[q]-=nw; 
			a[i]^=1;
			nw=a[i]^tag[q];
			ans[q]+=(nw);
		}
		solve1(p),solve2(p);
	}
	else{
		for(int i=p+1;i<=q-1;i++){
			tag[i]^=1;
			ans[i]=(R[i]-L[i]+1)-ans[i];
			swap(L_1[i],L_0[i]);
		//	if((L_1[i] && L_0[i]) || (R_1[i] && R_0[i]))  cout<<"FFFFF";
			swap(R_1[i],R_0[i]);
			swap(MAX_1[i],MAX_0[i]);
		}
		for(int i=l;i<=R[p];i++){
			int nw=a[i]^tag[p];
			ans[p]-=(nw);
			a[i]^=1;
			nw=a[i]^tag[p];
			ans[p]+=(nw);
		}
		solve1(p),solve2(p);
		for(int i=L[q];i<=r;i++){
			int nw=a[i]^tag[q];
			ans[q]-=(nw);
			a[i]^=1;
			nw=a[i]^tag[q];
			ans[q]+=(nw);
		}
		solve1(q),solve2(q);
	}
}

int ask3(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		int res=0;
		for(int i=l;i<=r;i++){
			int nw=a[i]^tag[p];
			res+=(nw);
		}
		return res;
	}
	else{
		int res=0;
		for(int i=p+1;i<=q-1;i++)res+=ans[i];
		for(int i=l;i<=R[p];i++) {
			int nw=a[i]^tag[p];
			res+=(nw);
		}
		for(int i=L[q];i<=r;i++) {
			int nw=a[i]^tag[q];
			res+=(nw);
		}
		return res;
	}
}

int ask4(int l,int r){
	int p=pos[l],q=pos[r];
	if(p==q){
		int cnt=0,anss=0;
		for(int i=l;i<=r;i++){
			if((a[i]^tag[p])==1){
				cnt++;
				anss=max(anss,cnt);
			}
			else cnt=0;
		}
		return anss;
	}
	else{
		int max1=0,max2=0,max3=0;
		int cnt=0;
		for(int i=l;i<=R[p];i++){
			if((a[i]^tag[p])==1){
				cnt++;
				max1=max(max1,cnt);
			}
			else cnt=0;
		}
		cnt=0;
		for(int i=p+1;i<=q-1;i++) max2=max(max2,MAX_1[i]);
		cnt=0;
		for(int i=L[q];i<=r;i++){
			if((a[i]^tag[q])==1){
				cnt++;
				max3=max(max3,cnt);
			}
			else cnt=0;
		}
		int max4=0;
		cnt=0;
		int pp=0,qq=0;
		for(int i=R[p];i>=l;i--){
			if((a[i]^tag[p])==1) pp++;
			else break;
		}
		for(int i=L[q];i<=r;i++){
			if((a[i]^tag[q])==1) qq++;
			else break;
		}
		cnt=0;
		for(int i=p;i<=q;i++){
			max4=max(max4,cnt);
			if(i==p){
				cnt+=pp;
				max4=max(max4,cnt);
				continue;
			}
			if(i==q){
				cnt+=qq;
				max4=max(max4,cnt);
				continue;
			}
			if(L_1[i]==R[i]-L[i]+1){
				cnt+=L_1[i];
				max4=max(max4,cnt);	
				continue;
			}
			else{
				max4=max(max4,cnt);
				if(L_1[i-1]>=R[i-1]-L[i-1]+1 && L_1[i]==R_1[i]){
					cnt+=L_1[i];
					max4=max(max4,cnt);
					cnt=0;
					continue;
				}
				else{
					cnt=0;
					if(i-1>=p+1) cnt+=R_1[i-1];
					max4=max(max4,cnt);
					cnt+=L_1[i];
					max4=max(max4,cnt);
				}
			}
		}
		max4=max(max4,cnt);
		return max(max1,max(max2,max(max3,max4))); 
	}
}

signed main(){
	memset(a,0,sizeof(a));
	memset(ans,0,sizeof(ans));
	memset(tag,0,sizeof(tag));
	memset(L_1,0,sizeof(L_1));
	memset(L_0,0,sizeof(L_0));
	memset(R_1,0,sizeof(R_1));
	memset(R_0,0,sizeof(R_0));
	memset(MAX_0,0,sizeof(MAX_0));
	memset(MAX_1,0,sizeof(MAX_1));
	cin>>n>>m;
	int t=sqrt(n);
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=t;i++){
		L[i]=(i-1) *sqrt(n)+1;
		R[i]=sqrt(n)*i;
	}
	if(R[t]<n){
		t++;
		L[t]=R[t-1]+1;
		R[t]=n;
	}
	for(int i=1;i<=t;i++){
		for(int j=L[i];j<=R[i];j++){
			pos[j]=i;
			if(a[j]==1) ans[i]++;
		}
		solve1(i),solve2(i);
	}
	for(int i=1;i<=t;i++) solve1(i),solve2(i);
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		int l,r;
		cin>>l>>r;
		l++,r++; 
		if(op==0) cg0(l,r);
		if(op==1) cg1(l,r);
		if(op==2) cg2(l,r);
		if(op==3) cout<<ask3(l,r)<<endl;
		if(op==4) cout<<ask4(l,r)<<endl;
	}
}
2025/1/21 11:29
加载中...