P2572序列操作 求助
  • 板块学术版
  • 楼主54zyd
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/8/3 09:37
  • 上次更新2025/8/3 10:16:23
查看原帖
P2572序列操作 求助
1353816
54zyd楼主2025/8/3 09:37
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,a[1100000];
struct as{
	int a,l;
	int s,lm,rm,m,f;
	int s0,lm0,rm0,m0,f0;
}t[4400000];
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
as qw(as l,as r){
	as p;
	p.a=-1;
	p.l=l.l+r.l;
	
	if(l.f){
		p.lm=l.s+r.lm;
	}
	else{
		p.lm=l.lm;
	}
	if(r.f){
		p.rm=r.s+l.rm;
	}
	else{
		p.rm=r.rm;
	}
	p.s=l.s+r.s;
	p.m=max({ p.lm , p.rm , l.m , r.m , l.rm+r.lm });
	if(l.f&&r.f){
		p.f=1;
	}
	else{
		p.f=0;
	}
//////////////////
	if(l.f0){
		p.lm0=l.s0+r.lm0;
	}
	else{
		p.lm0=l.lm0;
	}
	if(r.f0){
		p.rm0=r.s0+l.rm0;
	}
	else{
		p.rm0=r.rm0;
	}
	p.s0=l.s0+r.s0;
	p.m0=max({ p.lm0 , p.rm0 , l.m0 , r.m0 , l.rm0+r.lm0 });
	if(l.f0&&r.f0){
		p.f0=1;
	}
	else{
		p.f0=0;
	}
	return p;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void we(int d,int l,int r){
	if(t[d].a==-1){
		return;
	}
	if(t[d].a==2){
		t[d*2].a=t[d].a;
		swap(t[d*2].f,t[d*2].f0);
		swap(t[d*2].m,t[d*2].m0);
		swap(t[d*2].lm,t[d*2].lm0);
		swap(t[d*2].rm,t[d*2].rm0);
		swap(t[d*2].s,t[d*2].s0);
		t[d*2+1].a=t[d].a;
		swap(t[d*2+1].f,t[d*2+1].f0);
		swap(t[d*2+1].m,t[d*2+1].m0);
		swap(t[d*2+1].lm,t[d*2+1].lm0);
		swap(t[d*2+1].rm,t[d*2+1].rm0);
		swap(t[d*2+1].s,t[d*2+1].s0);
	}
	else if(t[d].a==1||t[d].a==0){
		t[d*2].f=t[d*2].a=t[d].a;
		t[d*2].s=t[d*2].lm=t[d*2].rm=t[d*2].m=t[d].a*t[d*2].l;
		t[d*2].f0=t[d].a^1;
		t[d*2].s0=t[d*2].lm0=t[d*2].rm0=t[d*2].m0=(t[d].a^1)*t[d*2].l;
			
		t[d*2+1].f=t[d*2+1].a=t[d].a;
		t[d*2+1].s=t[d*2+1].lm=t[d*2+1].rm=t[d*2+1].m=t[d].a*t[d*2+1].l;
		t[d*2+1].f0=t[d].a^1;
		t[d*2+1].s0=t[d*2+1].lm0=t[d*2+1].rm0=t[d*2+1].m0=(t[d].a^1)*t[d*2+1].l;
	}
	t[d].a=-1;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void js(int d,int l,int r){
	if(l==r){
		t[d].l=1;
		t[d].lm=t[d].rm=t[d].m=t[d].s=a[l]*t[d].l;
		t[d].f=a[l];
		t[d].lm0=t[d].rm0=t[d].m0=t[d].s0=(a[l]^1)*t[d].l;
		t[d].f0=a[l]^1;
		t[d].a=-1;
		return;
	}
	int h=(l+r)/2;
	js(d*2,l,h);
	js(d*2+1,h+1,r);
	t[d]=qw(t[d*2],t[d*2+1]);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void xg(int d,int l,int r,int q){
	if(x<=l&&r<=y){
		if(q==2){
			t[d].a=q;
			swap(t[d].f,t[d].f0);
			swap(t[d].m,t[d].m0);
			swap(t[d].lm,t[d].lm0);
			swap(t[d].rm,t[d].rm0);
			swap(t[d].s,t[d].s0);
		 	return;
		}
		t[d].f=t[d].a=q;
		t[d].s=t[d].lm=t[d].rm=t[d].m=q*t[d].l;
		t[d].f0=q^1;
		t[d].s0=t[d].lm0=t[d].rm0=t[d].m0=(q^1)*t[d].l;
		return;
	}
	we(d,l,r);
	int h=(l+r)/2;
	if(x<=h){
		xg(d*2,l,h,q);
	}
	if(h<y){
		xg(d*2+1,h+1,r,q);
	}
	t[d]=qw(t[d*2],t[d*2+1]);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int cx(int d,int l,int r){
	if(x<=l&&r<=y){
		return t[d].s;
	}
	we(d,l,r);
	int h=(l+r)/2,k=0;
	if(x<=h){
		k+=cx(d*2,l,h);
	}
	if(h<y){
		k+=cx(d*2+1,h+1,r);
	}
	t[d]=qw(t[d*2],t[d*2+1]);
	return k;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
as cs(int d,int l,int r){
	if(x<=l&&r<=y){
		return t[d];
	}
	we(d,l,r);
	int h=(l+r)/2;
	if(x<=h&&h<y){
		return qw(cs(d*2,l,h),cs(d*2+1,h+1,r));
	}
	if(y<=h){
		return cs(d*2,l,h);
	}
	if(h<x){
		return cs(d*2+1,h+1,r);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	js(1,1,n);
	while(m--){
		int q;
		scanf("%d%d%d",&q,&x,&y);
		x++;
		y++;
		if(q==0||q==1||q==2){
			xg(1,1,n,q);
		}
		else if(q==3){
			printf("%d\n",cx(1,1,n));
		}
		else{
			printf("%d\n",cs(1,1,n).m);
		}
	}
	return 0;
}
2025/8/3 09:37
加载中...