全WA求调 o(╥﹏╥)o P2572
查看原帖
全WA求调 o(╥﹏╥)o P2572
1000916
jiangjiajin___楼主2024/12/20 19:46
#include <bits/stdc++.h>
#define int long long
#define ls(p) p<<1
#define rs(p) p<<1|1
using namespace std;
const int N=5e5+6;
int n,m;
int a[N];
struct tree{
	int left,right;
	int b,lb,rb,mb,c,lc,rc,mc;
	int tag,rev,len;
}tr[4*N];
void pushup(tree &t, tree l, tree r){
	t.b=l.b+r.b;
	t.lb=l.c ? l.lb : l.b+r.lb;
	t.rb=r.c ? r.rb : r.b+l.rb;
	t.mb=max(max(l.mb,r.mb),l.rb+r.lb);
	t.c=l.c+r.c;
	t.lc=l.b ? l.lc : l.c+r.lc;
	t.rc=r.b ? r.rc : r.c+l.rc;
	t.mc=max(max(l.mc,r.mc),l.rc+r.lc);
}
void use(int p,int opt){
	tree& t=tr[p];
	if(opt==0){
		t.b=t.lb=t.rb=t.mb=0;
		t.c=t.lc=t.rc=t.mc=t.len;
		t.tag=0;
		t.rev=0;
	}else if(opt==1){
		t.b=t.lb=t.rb=t.mb=t.len;
		t.c=t.lc=t.rc=t.mc=0;
		t.tag=1;
		t.rev=0;
	}else if(opt==2){
		swap(t.b,t.c);
		swap(t.lb,t.lc);
		swap(t.rb,t.rc);
		swap(t.mb,t.mc);
		t.rev^=1;
	}
}
void pushdown(int p){
	tree& t=tr[p];
	if(t.tag=0)use(ls(p),0),use(rs(p),0);
	if(t.tag=1)use(ls(p),1),use(rs(p),1);
	if(t.rev)use(ls(p),2);use(rs(p),2);
	t.tag=-1;t.rev=0;
}
void change(int p,int x,int y,int k){
	if(x<=tr[p].left&&tr[p].right<=y){
		use(p,k);
		return;
	}
	pushdown(p);
	change(ls(p),x,y,k);
	change(rs(p),x,y,k);
	pushup(tr[p],tr[ls(p)],tr[rs(p)]);
}
tree query(int p,int x,int y){
	if(x<=tr[p].left&&tr[p].right<=y)return tr[p];
	pushdown(p);
	tree T;
	pushup(T,query(ls(p),x,y),query(rs(p),x,y));
	return T;
}
void build(int p,int l,int r){
	int t=a[l];
	tr[p]={l,r,t,t,t,t,t^1,t^1,t^1,t^1,r-l+1,-1,0};
	if(l==r)return;
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(tr[p],tr[ls(p)],tr[rs(p)]);
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int opt,l,r;
		cin>>opt>>l>>r;
		++l,++r;
		if(opt<3){
			change(1,l,r,opt);
		}else{
			tree t=query(1,l,r);
			cout<<(opt==3 ? t.b : t.mb)<<endl;
		}
	}
	return 0;
}
2024/12/20 19:46
加载中...