只过 Hack求调
查看原帖
只过 Hack求调
1127126
yueyan_WZF楼主2024/10/14 10:44
#include<bits/stdc++.h>
#define l(k) k*2
#define r(k) k*2+1
using namespace std;
struct node{
	int l,r,lazy,Lazy,sum_l_1,sum_r_1,sum_l_0,sum_r_0,sum,sum_0;
}z[10000003];
int a[10000004];
int n,m;
void pushup(int k){
	if(z[l(k)].sum_l_1==z[l(k)].r-z[l(k)].l+1){
		z[k].sum_l_1=z[l(k)].sum_l_1+z[r(k)].sum_l_1;
	}
	else{
		z[k].sum_l_1=z[l(k)].sum_l_1;
	}
	if(z[r(k)].sum_r_1==z[r(k)].r-z[r(k)].l+1){
		z[k].sum_r_1=z[l(k)].sum_r_1+z[r(k)].sum_r_1;
	}
	else{
		z[k].sum_r_1=z[r(k)].sum_r_1;
	}
	if(z[l(k)].sum_l_0==z[l(k)].r-z[l(k)].l+1){
		z[k].sum_l_0=z[l(k)].sum_l_0+z[r(k)].sum_l_0;
	}
	else{
		z[k].sum_l_0=z[l(k)].sum_l_0;
	}
	if(z[r(k)].sum_r_0==z[r(k)].r-z[r(k)].l+1){
		z[k].sum_r_0=z[l(k)].sum_r_0+z[r(k)].sum_r_0;
	}
	else{
		z[k].sum_r_0=z[r(k)].sum_r_0;
	}
	z[k].sum=z[l(k)].sum+z[r(k)].sum;
	z[k].sum_0=z[l(k)].sum_0+z[r(k)].sum_0;
}
void lazzy(int k){
	int l=l(k),r=r(k);
	if(z[k].Lazy){
		swap(z[l].sum,z[l].sum_0);
		swap(z[l].sum_l_0,z[l].sum_l_1);
		swap(z[l].sum_r_0,z[l].sum_r_1);
		swap(z[r].sum,z[r].sum_0);
		swap(z[r].sum_l_0,z[r].sum_l_1);
		swap(z[r].sum_r_0,z[r].sum_r_1);
		z[l].Lazy=z[l].Lazy^1;
		z[r].Lazy=z[r].Lazy^1;
		z[k].Lazy=0;
	}
	if(z[k].lazy!=-1){
		int p=z[k].lazy;	
		if(!p){
			z[l].sum=z[l].sum_l_1=z[l].sum_r_1=0;
			z[l].sum_0=z[l].sum_l_0=z[l].sum_r_0=z[l].r-z[l].l+1;
			z[r].sum=z[r].sum_l_1=z[r].sum_r_1=0;
			z[r].sum_0=z[r].sum_l_0=z[r].sum_r_0=z[r].r-z[r].l+1;
		}
		if(p){
			z[l].sum_0=z[l].sum_l_0=z[l].sum_r_0=0;
			z[l].sum=z[l].sum_l_1=z[l].sum_r_1=(z[l].r-z[l].l+1);
			z[r].sum_0=z[r].sum_l_0=z[r].sum_r_0=0;
			z[r].sum=z[r].sum_l_1=z[r].sum_r_1=(z[r].r-z[r].l+1);
		} 
		z[l].lazy=z[r].lazy=p;
		z[k].lazy=-1;
	}
	
}
void build(int l,int r,int k){
	z[k].l=l;
	z[k].r=r;
	z[k].lazy=-1;
	if(l==r){
		
		if(a[l]){
			z[k].sum++;
			z[k].sum_l_1=z[k].sum_r_1=1;
		}
		if(!a[l]){
			z[k].sum_0++;
			z[k].sum_l_0=z[k].sum_r_0=1;
		}
		z[k].Lazy=0;
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,l(k));
	build(mid+1,r,r(k));
	pushup(k);
}
void chang(int l,int r,int p,int k){
	lazzy(k);
	if(z[k].l>=l&&z[k].r<=r){
		if(!p){
			z[k].sum=z[k].sum_l_1=z[k].sum_r_1=0;
			z[k].sum_0=z[k].sum_l_0=z[k].sum_r_0=z[k].r-z[k].l+1;
		}
		if(p){
			z[k].sum=z[k].sum_l_1=z[k].sum_r_1=(z[k].r-z[k].l+1);
			z[k].sum_0=z[k].sum_l_0=z[k].sum_r_0=0;
		} 
		z[k].lazy=p;
		return ;
	}
	
	int mid=z[k].l+z[k].r>>1;
	if(l<=mid){
		chang(l,r,p,l(k));
	}
	if(r>mid){
		chang(l,r,p,r(k));
	}
	pushup(k);
}
void Chan(int l,int r,int k){
	lazzy(k);
	if(z[k].l>=l&&z[k].r<=r){
		swap(z[k].sum,z[k].sum_0);
		swap(z[k].sum_l_0,z[k].sum_l_1);
		swap(z[k].sum_r_1,z[k].sum_r_0);
		z[k].Lazy=1;
		return ;
	}
	
	int mid=z[k].l+z[k].r>>1;
	if(l<=mid){
		Chan(l,r,l(k));
	}
	if(r>mid){
		Chan(l,r,r(k));
	}
	pushup(k);
}
int find(int l,int r,int k){
	lazzy(k);
	if(z[k].l>=l&&z[k].r<=r){
		return z[k].sum;
	}
	
	int mid=z[k].l+z[k].r>>1;
	int sum=0;
	if(l<=mid){
		sum+=find(l,r,l(k));
	}
	if(r>mid){
		sum+=find(l,r,r(k));
	}
	return sum;
}
int Find(int l,int r,int k){
	lazzy(k);
	if(z[k].l>=l&&z[k].r<=r){
		int maxx;
		maxx=z[l(k)].sum_r_1+z[r(k)].sum_l_1;
		maxx=max(maxx,max(z[k].sum_l_1,z[k].sum_r_1));
		return maxx;
	}
	int maxx=0;
	
	int mid=z[k].r+z[k].l>>1;
	if(l<=mid){
		maxx=max(maxx,Find(l,r,l(k)));
	}
	if(r>mid){
		maxx=max(maxx,Find(l,r,r(k)));
	}
	if(l<=mid&&r>mid){
		maxx=max(maxx,min(z[l(k)].sum_r_1,mid-l+1)+min(z[r(k)].sum_l_1,r-mid));
	}
	return maxx;
}
signed main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int opt,l,r;
		scanf("%d%d%d",&opt,&l,&r);
		l=l+1;
		r=r+1; 
		if(opt==0){
			chang(l,r,0,1);
		}
		if(opt==1){
			chang(l,r,1,1);
		}
		if(opt==2){
			Chan(l,r,1);
		}
		if(opt==3){
			printf("%d\n",find(l,r,1));
		}
		if(opt==4){
			printf("%d\n",Find(l,r,1));
		}
	}
}
2024/10/14 10:44
加载中...