P2572求助
  • 板块学术版
  • 楼主willw
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/3 09:34
  • 上次更新2025/8/3 16:10:11
查看原帖
P2572求助
1351400
willw楼主2025/8/3 09:34
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=1e5+20,MAXX=1e9;
int n,m,a[N];
struct node{
	ll num,cnt,sum,tg,l,r,fr,en,cntz,sumz,frz,enz;//cnt:连续 sum:不连续
	friend node operator + (node x,node y){
		node z;
		z.l=x.l,z.r=y.r;
		z.cnt=max({x.cnt,y.cnt,x.en+y.fr});
		z.cntz=max({x.cntz,y.cntz,x.enz+y.frz});
		z.num=-1;
		z.sum=x.sum+y.sum;
		z.sumz=x.sumz+y.sumz;
		z.tg=0;
		if(x.fr==x.r-x.l+1){
			z.fr=x.fr+y.fr;
		}
		else{
			z.fr=x.fr;
		}
		if(y.en==y.r-y.l+1){
			z.en=x.en+y.en;
		}
		else{
			z.en=y.en;
		}
		if(x.frz==x.r-x.l+1){
			z.frz=x.frz+y.frz;
		}
		else{
			z.frz=x.frz;
		}
		if(y.enz==y.r-y.l+1){
			z.enz=x.enz+y.enz;
		}
		else{
			z.enz=y.enz;
		}
		return z;
	}
	friend node operator - (node x,node y){
		node z;
		z.num=y.num;
		if(y.num!=-1){
			if(y.num==1){
				z.sum=x.r-x.l+1;
				z.cnt=x.r-x.l+1;
				z.en=x.r-x.l+1;
				z.fr=x.r-x.l+1;
				z.sumz=0;
				z.cntz=0;
				z.enz=0;
				z.frz=0;
				z.tg=0;
			}
			else{
				z.sumz=x.r-x.l+1;
				z.cntz=x.r-x.l+1;
				z.enz=x.r-x.l+1;
				z.frz=x.r-x.l+1;
				z.sum=0;
				z.cnt=0;
				z.en=0;
				z.fr=0;
				z.tg=0;
			}
			z.l=x.l;
			z.r=x.r;
			return z;
		}
		else{
			return x;
		}
	}
	friend node operator * (node x,node y){
		node z;
		if(y.num==1){
//			y.num=0;
			z=x-y;
		}
		else if(y.num==0){
//			y.num=1;
			z=x-y;
		}
		else if(y.num==-1){
			z.sum=x.sumz;
			z.cnt=x.cntz;
			z.fr=x.frz;
			z.en=x.enz;
			z.sumz=x.sum;
			z.cntz=x.cnt;
			z.frz=x.fr;
			z.enz=x.en;
			z.l=x.l;
			z.r=x.r;
			z.num=x.num;
		}
		if(x.tg==1){
			z.tg=0;
		}
		else{
			z.tg=1;
		}
		return z;
	}
}tr[N*3];
void build(ll p,ll l,ll r){
	if(l==r){
		if(a[l]==1){
			tr[p].sum=1;
			tr[p].cnt=1;
			tr[p].tg=0;
			tr[p].en=1;
			tr[p].fr=1;
			tr[p].l=l;
			tr[p].r=r;
			tr[p].num=-1;	
		}
		else{
			tr[p].sumz=1;
			tr[p].cntz=1;
			tr[p].tg=0;
			tr[p].enz=1;
			tr[p].frz=1;
			tr[p].l=l;
			tr[p].r=r;
			tr[p].num=-1;
		}
		return;
	}
	ll mid=l+r>>1;
	build(p<<1,l,mid);
	build((p<<1)+1,mid+1,r);
	tr[p]=tr[p<<1]+tr[(p<<1)+1];
}
void givc(ll now,node p){
	tr[now]=tr[now]-p;
}
void pc(ll now){
	if(tr[now].num!=-1){
		givc(now<<1,tr[now]);
		givc((now<<1)+1,tr[now]);
		tr[now].tg=0;
		tr[now].num=-1;		
	} 
}
void give(ll now,node p){
	tr[now]=tr[now]*p;
}
void pd(ll now){
	if(tr[now].tg==1){
		give(now<<1,tr[now]);
		give((now<<1)+1,tr[now]);
		tr[now].tg=0;
		tr[now].num=-1;	
	}
	else{
		pc(now);
		tr[now].tg=0;
		tr[now].num=-1;
	}
}
void change(ll p,ll x,ll y,ll k){
	if(tr[p].l>=x&&tr[p].r<=y){
		tr[p].num=k;
		givc(p,tr[p]);
		tr[p].tg=0;
		return;
	}  
	pd(p);
	ll mid=tr[p].l+tr[p].r>>1;
	if(x<=mid){
		change(p<<1,x,y,k);
	}
	if(y>mid){
		change((p<<1)+1,x,y,k);
	}
	ll tg=tr[p].tg;
	ll num=tr[p].num;
	tr[p]=tr[p<<1]+tr[(p<<1)+1];
	tr[p].tg=tg;
	tr[p].num=num;
}
void xo(ll p,ll x,ll y){
	if(tr[p].l>=x&&tr[p].r<=y){
		if(tr[p].tg==1){
			tr[p].tg=0;
		}
		else{
			tr[p].tg=1;
		}
		if(tr[p].num==1){
			tr[p].num==0;
			tr[p].sumz=tr[p].r-tr[p].l+1;
			tr[p].cntz=tr[p].r-tr[p].l+1;
			tr[p].enz=tr[p].r-tr[p].l+1;
			tr[p].frz=tr[p].r-tr[p].l+1;
			tr[p].sum=0;
			tr[p].cnt=0;
			tr[p].en=0;
			tr[p].fr=0;
		}
		else if(tr[p].num==0){
			tr[p].num=1;
			tr[p].sum=tr[p].r-tr[p].l+1;
			tr[p].cnt=tr[p].r-tr[p].l+1;
			tr[p].en=tr[p].r-tr[p].l+1;
			tr[p].fr=tr[p].r-tr[p].l+1;
			tr[p].sumz=0;
			tr[p].cntz=0;
			tr[p].enz=0;
			tr[p].frz=0;
		}
		else if(tr[p].num==-1){
			node z=tr[p];
			tr[p].sum=z.sumz;
			tr[p].cnt=z.cntz;
			tr[p].fr=z.frz;
			tr[p].en=z.enz;
			tr[p].sumz=z.sum;
			tr[p].cntz=z.cnt;
			tr[p].frz=z.fr;
			tr[p].enz=z.en;
			tr[p].l=z.l;
			tr[p].r=z.r;
			tr[p].num=z.num;
		}
		return;
	}
	pd(p);
	ll mid=tr[p].l+tr[p].r>>1;
	if(x<=mid){
		xo(p<<1,x,y);
	}
	if(y>mid){
		xo((p<<1)+1,x,y);
	}
	tr[p]=tr[p<<1]+tr[(p<<1)+1];
}
ll askcnt(ll p,ll x,ll y){
	if(tr[p].l>=x&&tr[p].r<=y){
		return tr[p].cnt;
	}
	pd(p);
	ll mid=tr[p].l+tr[p].r>>1;
	ll ans=0;
	if(x<=mid){
		ans=askcnt(p<<1,x,y);
	}
	if(y>mid){
		ans=max(ans,askcnt((p<<1)+1,x,y));
	}
	if(tr[p<<1].r-tr[p<<1].en+1<x){
		if(tr[(p<<1)+1].l+tr[(p<<1)+1].fr-1>y){
			ans=max(ans,y-tr[(p<<1)+1].l+1+tr[p<<1].r-x+1);
		}
		else{
			ans=max(ans,tr[(p<<1)+1].fr+tr[p<<1].r-x+1);
		}
	}
	else{
		if(tr[(p<<1)+1].l+tr[(p<<1)+1].fr-1>y){
			ans=max(ans,y-tr[(p<<1)+1].l+1+tr[p<<1].en);
		}
		else{
			ans=max({ans,tr[p<<1].en+tr[(p<<1)+1].fr});
		}
	}
	return ans;
}
ll asksum(ll p,ll x,ll y){
	if(tr[p].l>=x&&tr[p].r<=y){
		return tr[p].sum;
	}
	pd(p);
	ll mid=tr[p].l+tr[p].r>>1;
	ll ans=0;
	if(x<=mid){
		ans=asksum(p<<1,x,y);
	}
	if(y>mid){
		ans+=asksum((p<<1)+1,x,y);
	}
	return ans;
}
int main(){
//	ios::sync_with_stdio(false);
//	cin.tie(0);
//	cout.tie(0);re
//	freopen("out.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		ll op,l,r;
		cin>>op>>l>>r;
		if(op==0||op==1){
			change(1,l+1,r+1,op);
//			for(int j=1;j<=n*3;j++){
//				printf("tr[j].l=%d,tr[j].r=%d,tr[j].cnt=%d\n",tr[j].l,tr[j].r,tr[j].cnt);
//			}
//			printf("\n===================================================================\n");
		}
		if(op==2){
			xo(1,l+1,r+1);
//			for(int j=1;j<=n*3;j++){
//				printf("tr[j].l=%d,tr[j].r=%d,tr[j].cnt=%d\n",tr[j].l,tr[j].r,tr[j].cnt);
//			}
//			printf("\n===================================================================\n");
		}
		if(op==3){
			cout<<asksum(1,l+1,r+1)<<"\n";
//			for(int j=1;j<=n*3;j++){
//				printf("tr[j].l=%d,tr[j].r=%d,tr[j].cnt=%d\n",tr[j].l,tr[j].r,tr[j].cnt);
//			}
//			printf("\n===================================================================\n");
		}
		if(op==4){
			cout<<askcnt(1,l+1,r+1)<<"\n";
//			for(int j=1;j<=n*3;j++){
//				printf("tr[j].l=%d,tr[j].r=%d,tr[j].cnt=%d\n",tr[j].l,tr[j].r,tr[j].cnt);
//			}
//			printf("\n===================================================================\n");
		}
	}
	return 0;
}
/*
15 20
0 1 1 1 0 0 0 0 1 1 0 1 0 1 0
0 1 1 0 1 1 1 0 0 1 1 1 1 0 0
*/
2025/8/3 09:34
加载中...