QAQ 0分求助
查看原帖
QAQ 0分求助
174448
我能自己爬了楼主2022/2/9 22:51
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll rd(){
   ll w=0,f=1;char ch=getchar();
   while(ch<'0'||ch>'9')f=(ch=='-')?-1:1,ch=getchar();
   while(ch>='0'&&ch<='9')w=(w<<1)+(w<<3)+(ch^48),ch=getchar();
   return w*f;
}
const int lm=100001;
ll n,m,a[lm],b[lm];
struct node{
	ll id,r;
}wyz[lm<<2];
ll ls(ll p){
	return p<<1;
}
ll rs(ll p){
	return p<<1|1;
}
ll ans[lm<<2],tag[lm<<2],tag3[lm<<2],tag2[lm<<2],ans3[lm<<2],ans4[lm<<2],ans2[lm<<2],ans5[lm<<2],ans6[lm<<2],ans7[lm<<2];
//ans--总共有多少1 1--全0 2--全1  3--取反   ans3---左边最长  ans4---右边最长  ans2---最多连续的1   ans5--左边   ans6---右边  ans7--最多连续   
void push_up(ll p,ll l,ll r){
	ll mid=(l+r)>>1;
	ans[p]=ans[ls(p)]+ans[rs(p)];
	ans2[p]=max(ans2[rs(p)],max(ans2[ls(p)],ans3[rs(p)]+ans4[ls(p)]));
	ans3[p]=ans3[ls(p)]+(ans3[rs(p)]*(ans7[ls(p)]==0));
	ans4[p]=ans4[rs(p)]+(ans4[ls(p)]*(0==ans7[rs(p)]));
	ans2[p]=max(ans2[p],max(ans3[p],ans4[p]));
	ans5[p]=ans5[ls(p)]+(ans5[rs(p)]*(0==ans[ls(p)]));
	ans6[p]=ans6[rs(p)]+(ans6[ls(p)]*(0==ans[rs(p)]));
	ans7[p]=max(ans7[ls(p)],max(ans7[rs(p)],ans5[rs(p)]+ans6[ls(p)]));
	ans7[p]=max(ans5[p],max(ans6[p],ans7[p]));
}
void build(ll p,ll l,ll r){
	wyz[p].r=r;
	wyz[p].id=p;
	tag[p]=0;
	if(l==r){
		ans[p]=ans2[p]=ans3[p]=ans4[p]=a[l];
		ans5[p]=ans6[p]=ans7[p]=!a[l]; 
		return ;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p,l,r);
}
void f(ll p,ll l,ll r,ll k,ll k2,ll k3){
	 if(k==1){
	 	tag[p]=1;
	 	tag2[p]=0;
	 	tag3[p]=0;
	 	ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
	 	ans5[p]=ans6[p]=ans7[p]=0;
	 }
	 else if(k2==1){
	 	tag[p]=0;
	 	tag2[p]=1;
	 	tag3[p]=0;
	 	ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
	 	ans5[p]=ans6[p]=ans7[p]=(r-l+1);
	 }
	else if(k3==1){
		if(tag[p]>0){
			tag[p]=0;
			tag2[p]=1;
			tag3[p]=0;
			ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
	 		ans5[p]=ans6[p]=ans7[p]=(r-l+1);
			return ;
		}
		else if(tag2[p]>0){
			tag[p]=1;
			tag2[p]=0;
			tag3[p]=0;
			ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
	 		ans5[p]=ans6[p]=ans7[p]=0;
			return ;
		}
 		tag[p]=0;
 		tag2[p]=0;
 		tag3[p]++;
 		tag3[p]%=2;
 		ans[p]=(r-l+1)-ans[p];
 		swap(ans2[p],ans7[p]);
 		swap(ans3[p],ans5[p]);
 		swap(ans4[p],ans6[p]);
	}
}
void push_down(ll p,ll l,ll r){
	ll mid=(l+r)>>1;
	f(ls(p),l,mid,tag[p],tag2[p],tag3[p]);
	f(rs(p),mid+1,r,tag[p],tag2[p],tag3[p]);
	tag[p]=tag2[p]=tag3[p]=0;
} 
void update(ll p,ll l,ll r,ll ul,ll ur,ll k){
	if(l==ul&&r==ur){
		if(k==1){
			tag[p]=1;
	 		tag2[p]=0;
	 		tag3[p]=0;
	 		ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
	 		ans5[p]=ans6[p]=ans7[p]=0;
		}
		else if(k==2){
			tag[p]=0;
	 		tag2[p]=1;
	 		tag3[p]=0;
	 		ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
	 		ans5[p]=ans6[p]=ans7[p]=(r-l+1);
		}
		else {
			if(tag[p]>0){
				tag[p]=0;
				tag2[p]=1;
				tag3[p]=0;
	 			ans2[p]=ans3[p]=ans4[p]=ans[p]=0;
	 			ans5[p]=ans6[p]=ans7[p]=(r-l+1);
				return ;
			}
			else if(tag2[p]>0){
				tag[p]=1;
				tag2[p]=0;
				tag3[p]=0;
				ans2[p]=ans3[p]=ans4[p]=ans[p]=(r-l+1);
	 			ans5[p]=ans6[p]=ans7[p]=0;
				return ;
			}
 			tag[p]=0;
 			tag2[p]=0;
 			tag3[p]+=1;
 			tag3[p]%=2;
 			ans[p]=(r-l+1)-ans[p];
 			swap(ans2[p],ans7[p]);
 			swap(ans3[p],ans5[p]);
 			swap(ans4[p],ans6[p]);
		}
		return ;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(ul>mid)update(rs(p),mid+1,r,ul,ur,k);
	else if(ur<=mid)update(ls(p),l,mid,ul,ur,k);
	else {update(ls(p),l,mid,ul,mid,k);update(rs(p),mid+1,r,mid+1,ur,k);}
	push_up(p,l,r);
}
ll fd(ll p,ll l,ll r,ll fl,ll fr){
	if(l==fl&&r==fr)return ans[p];
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(fl>mid)return fd(rs(p),mid+1,r,fl,fr);
	else if(fr<=mid)return fd(ls(p),l,mid,fl,fr);
	else return fd(ls(p),l,mid,fl,mid)+fd(rs(p),mid+1,r,mid+1,fr); 
}
ll jl[lm>>2],ljl=0;
void fd3(ll p,ll l,ll r,ll fl,ll fr){
	if(l==fl&&r==fr){
		jl[++ljl]=p;
		return ;
	}
	push_down(p,l,r);
	ll mid=(l+r)>>1;
	if(fl>mid)fd3(rs(p),mid+1,r,fl,fr);
	else if(fr<=mid)fd3(ls(p),l,mid,fl,fr);
	else fd3(ls(p),l,mid,fl,mid),fd3(rs(p),mid+1,r,mid+1,fr); 
}
bool cmp(node x,node y){
	return x.r<y.r;
}
ll fd2(ll p,ll l,ll r,ll fl,ll fr){
	
	//cout<<"HAHA";
	ljl=0;ll sum=0;
	fd3(p,l,r,fl,fr);
	node nb[ljl+1];
	//sort(jl+1,jl+ljl+1);
	for(int i=1;i<=ljl;i++)nb[i].r=wyz[jl[i]].r,nb[i].id=jl[i],sum=max(sum,ans2[jl[i]]);
	sort(nb+1,nb+ljl+1,cmp);
	for(int i=1;i<=ljl;i++){
		//sum=max(sum,ans2[jl[i]]);
		ll sls=ans4[nb[i].id],j=i+1;
		while(j<ljl&&ans7[j]==0)sls+=ans2[nb[i].id],j++;
		if(ljl>1)sls+=ans3[nb[i].id];
		sum=max(sum,sls);
		i=j-1;
	}
	return sum;
} 
int main(){
//	freopen("P1438_2.in","r",stdin);
//	freopen("1.txt","w",stdout);
	n=rd();m=rd();
	for(int i=1;i<=n;i++)a[i]=rd();
	build(1,1,n);
//	for(int i=1;i<=n<<2;i++){
//		cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<endl;
//	}
	while(m--){
		ll op=rd(),l=rd(),r=rd();
		l++,r++;
		if(op==0){
			update(1,1,n,l,r,2);
		}
		else if(op==1){
			//ll q=rd();
			update(1,1,n,l,r,1);
			
		}
		else if(op==2)update(1,1,n,l,r,3);
		else if(op==3)printf("%lld\n",fd(1,1,n,l,r));
		else printf("%lld\n",fd2(1,1,n,l,r));
//		for(int i=1;i<=n<<2;i++){
//		cout<<i<<"----"<<ans[i]<<" "<<ans2[i]<<" "<<ans3[i]<<" "<<ans4[i]<<" "<<ans5[i]<<" "<<ans6[i]<<" "<<ans7[i]<<" "<<tag[i]<<" "<<tag2[i]<<" "<<tag3[i]<<endl;
//	}
	}
	return 0;
}

2022/2/9 22:51
加载中...