样例没过,求调
查看原帖
样例没过,求调
1124954
BLty777楼主2024/12/20 19:41
#include<bits/stdc++.h>
#define int long long
#define l(p) p<<1
#define r(p) p<<1|1
using namespace std;
const int N=1e5+5;
int n,m,a[N],id,x,y;
struct stu{
	int l,r,b,lb,rb,mb,c,lc,rc,mc,len,tag,rev;
}tr[4*N];
void pushup(stu &p,stu l,stu r){
	p.b=l.b+r.b;
	p.lb=l.c?l.lb:l.b+r.lb;
	p.rb=r.c?r.rb:r.b+l.rb;
	p.mb=max(max(l.mb,r.mb),l.rb+r.lb);
	p.c=l.c+r.c;
	p.lc=l.b?l.lc:l.c+r.lc;
	p.rc=r.b?r.rc:r.c+l.rc;
	p.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void build(int p,int l,int r){
	tr[p]={l,r,a[l],a[l],a[l],a[l],a[l]^1,a[l]^1,a[l]^1,a[l]^1,r-l+1,-1,0};
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(l(p),l,mid);
	build(r(p),mid+1,r);
	pushup(tr[p],tr[l(p)],tr[r(p)]);
}
void pd(int p,int k){
	if(k==0){
		tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=0;
		tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=tr[p].len;
		tr[p].tag=-1;
		tr[p].rev=0;
	}
	if(k==1){
		tr[p].b=tr[p].lb=tr[p].rb=tr[p].mb=tr[p].len;
		tr[p].c=tr[p].lc=tr[p].rc=tr[p].mc=0;
		tr[p].tag=-1;
		tr[p].rev=0;
	}
	if(k==2){
		swap(tr[p].b,tr[p].c);
		swap(tr[p].lb,tr[p].lc);
		swap(tr[p].rb,tr[p].rc);
		swap(tr[p].mb,tr[p].mc);
		tr[p].rev^=1;
	}
}
void pushdown(int p){
	if(!tr[p].tag) pd(l(p),0),pd(r(p),0);
	if(tr[p].tag==1) pd(l(p),1),pd(r(p),1);
	if(tr[p].rev) pd(l(p),2),pd(r(p),2);
	tr[p].tag=-1;
	tr[p].rev=0;
}
stu query(int p,int x,int y){
	if(tr[p].r>y||tr[p].l<x) return {};
	if(tr[p].l>=x&&tr[p].r<=y) return tr[p];
	pushdown(p);
	stu t;
	pushup(t,query(l(p),x,y),query(r(p),x,y));
	return t;
}
void change(int p,int x,int y,int k){
	if(tr[p].l>y||tr[p].r<x) return ;
	if(tr[p].l>=x&&tr[p].l<=y){
		pd(p,k);
		return ;
	}
	pushdown(p);
	int mid=(tr[p].l+tr[p].r)>>1;
	if(x<=mid) change(l(p),x,y,k);
	else change(r(p),x,y,k);
	pushup(tr[p],tr[l(p)],tr[r(p)]);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%lld",&id,&x,&y);
		x++,y++;
		if(id<3){
			change(1,x,y,id);
		}else{
			stu t=query(1,x,y);
			printf("%lld\n",id==3?t.b:t.mb);
		}
	}
	return 0;
} 
2024/12/20 19:41
加载中...