Hack过了,0pts,球跳
查看原帖
Hack过了,0pts,球跳
1113058
hlcg楼主2024/12/20 19:32

rt

#include<bits/stdc++.h>
#define int long long
#define lc p<<1
#define rc p<<1|1
#define N 100010
using namespace std;
struct lsx{
	int l,r,s1,s0,l1,l0,r1,r0,m1,m0;
	int lbchange,lbqufan;//change-1/0/1,qufan0/1
}a[N*4];
int n,m;
int w[N+10];
void pp(lsx& a,lsx i,lsx j){
	a.s1=i.s1+j.s1;
	a.s0=i.s0+j.s0;
	a.l1=(i.s0?i.l1:i.s1+j.l1);
	a.l0=(i.s1?i.l0:i.s0+j.l0);
	a.r1=(j.s0?j.r1:j.s1+i.r1);
	a.r0=(j.s1?j.r0:j.s0+i.r0);
	a.m1=max(max(i.m1,j.m1),i.r1+j.l1);
	a.m0=max(max(i.m0,j.m0),i.r0+j.l0);
	return ;
}
void pd(int p,int k){
	if(k==1){
		a[p]={a[p].l,a[p].r,1,0,1,0,1,0,1,0,-1,0};
		return ;
	}
	if(k==0){
		a[p]={a[p].l,a[p].r,0,1,0,1,0,1,0,1,-1,0};
		return ;
	}
	if(k==2){//qf
		swap(a[p].l0,a[p].l1);
		swap(a[p].m0,a[p].m1);
		swap(a[p].r0,a[p].r1);
		swap(a[p].s0,a[p].s1);
		a[p].lbqufan^=1;
		return ;
	}
}
void pushdown(int p){
	if(a[p].lbqufan==1){
		pd(lc,2);
		pd(rc,2);
	}
	if(a[p].lbchange==1){
		pd(lc,1);
		pd(rc,1);
	}
	if(a[p].lbchange==0){
		pd(lc,0);
		pd(rc,0);
	}
	a[p].lbchange=-1;
	a[p].lbqufan=0;
	return ;
}
void build(int p,int l,int r){
	a[p].l=l;
	a[p].r=r;
	a[p].lbchange=-1;
	if(l==r){
		if(w[l]==0){
			a[p].l0=1;
			a[p].m0=1;
			a[p].r0=1;
			a[p].s0=1;
		}else{
			a[p].l1=1;
			a[p].m1=1;
			a[p].r1=1;
			a[p].s1=1;
		}
		return ;
	}
	int mid=l+r>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	pp(a[p],a[lc],a[rc]);
	return ;
}
void change(int p,int x,int y,int k){
	if(x<=a[p].l&&a[p].r<=y){
		pd(p,k);
		return ;
	}
	if(y<a[p].l||a[p].r<x){
		return ;
	}
	pushdown(p);
	change(lc,x,y,k);
	change(rc,x,y,k);
	pp(a[p],a[lc],a[rc]);
	return ;
}
lsx re(int p,int x,int y){
	if(y<a[p].l||a[p].r<x){
		return {};
	}
	if(x<=a[p].l&&a[p].r<=y){
		return a[p];
	}
	pushdown(p);
	lsx T;
	pp(T,re(lc,x,y),re(rc,x,y));
	return T;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int k,x,y;
		cin>>k>>x>>y;
		x++,y++;
		if(k<3){
			change(1,x,y,k);
		}else{
			lsx T;
			T=re(1,x,y);
			cout<<(k==3 ? (T.s1) : (T.m1));
			puts("");
		}
	}
	return 0;
} 
2024/12/20 19:32
加载中...