40pts 求调
查看原帖
40pts 求调
845988
Shizaki_Crazy_Three楼主2024/9/22 20:31
#include<bits/stdc++.h>
using namespace std;
struct tree{
	int l;int r;
	int over;
	int value;
	int ll,rl;
	int sum;
	int len;
	int lv;int rv;
	bool used;
	int l0,r0;
	int value0;
	int sum0;
	int used1;
}t[100005*4];
int n,m;
int a[100005];
inline void pushup(int p){
	t[p].value=t[p<<1].value+t[p<<1|1].value;
	t[p].lv=t[p<<1].lv;
	t[p].rv=t[p<<1|1].rv;
	if(t[p<<1].rv&&t[p<<1|1].lv){
		t[p].sum=max(t[p<<1].sum,max(t[p<<1|1].sum,t[p<<1].rl+t[p<<1|1].ll));
		if(t[p<<1].ll==t[p<<1].len) t[p].ll=t[p<<1].ll+t[p<<1|1].ll;
		else t[p].ll=t[p<<1].ll;
		if(t[p<<1|1].rl==t[p<<1|1].len) t[p].rl=t[p<<1|1].rl+t[p<<1].rl;
		else t[p].rl=t[p<<1|1].rl;
	}else {
		t[p].sum=max(t[p<<1].sum,t[p<<1|1].sum);
		t[p].ll=t[p<<1].ll;
		t[p].rl=t[p<<1|1].rl;
	}
	t[p].value0=t[p<<1].value0+t[p<<1|1].value0;
	if(!t[p<<1].rv&&!t[p<<1|1].lv){
		t[p].sum0=max(t[p<<1].sum0,max(t[p<<1|1].sum0,t[p<<1].r0+t[p<<1|1].l0));
		if(t[p<<1].l0==t[p<<1].len) t[p].l0=t[p<<1].l0+t[p<<1|1].l0;
		else t[p].l0=t[p<<1].l0;
		if(t[p<<1|1].r0==t[p<<1|1].len) t[p].r0=t[p<<1|1].r0+t[p<<1].r0;
		else t[p].r0=t[p<<1|1].r0;
	}else {
		t[p].sum0=max(t[p<<1].sum0,t[p<<1|1].sum0);
		t[p].l0=t[p<<1].l0;
		t[p].r0=t[p<<1|1].r0;
	}
	
}
inline void build(int p,int l,int r){
	t[p].l=l;
	t[p].r=r;
	t[p].len=r-l+1;
	if(l==r){
		t[p].l0=t[p].r0=t[p].sum0=t[p].value0=!a[l];
		t[p].lv=t[p].rv=t[p].value=t[p].sum=t[p].ll=t[p].rl=a[l];
		return;
	}
	int mid=l+r>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
inline void spread(int p){
	if(t[p].used){
		t[p<<1].lv=t[p<<1].rv=t[p<<1|1].lv=t[p].rv=t[p].over;
		t[p<<1].sum=t[p<<1].value=t[p<<1].ll=t[p<<1].rl=(t[p<<1].r-t[p<<1].l+1)*t[p].over;
		t[p<<1|1].sum=t[p<<1|1].value=t[p<<1|1].ll=t[p<<1|1].rl=(t[p<<1|1].r-t[p<<1|1].l+1)*t[p].over;
		t[p<<1].sum0=t[p<<1].value0=t[p<<1].l0=t[p<<1].r0=(t[p<<1].r-t[p<<1].l+1)*!t[p].over;
		t[p<<1|1].sum0=t[p<<1|1].value0=t[p<<1|1].l0=t[p<<1|1].r0=(t[p<<1|1].r-t[p<<1|1].l+1)*!t[p].over;
		t[p<<1].used=t[p<<1|1].used=1;
		t[p<<1].over=t[p<<1|1].over=t[p].over;
	}else if(t[p].used1){
		swap(t[p<<1].sum,t[p<<1].sum0);
		swap(t[p<<1].ll,t[p<<1].l0);
		swap(t[p<<1].rl,t[p<<1].r0);
		swap(t[p<<1].value,t[p<<1].value0);
		swap(t[p<<1|1].sum,t[p<<1|1].sum0);
		swap(t[p<<1|1].ll,t[p<<1|1].l0);
		swap(t[p<<1|1].rl,t[p<<1|1].r0);
		swap(t[p<<1|1].value,t[p<<1|1].value0);
		t[p<<1].used1^=1;
		t[p<<1].lv=!t[p<<1].lv;
		t[p<<1].rv=!t[p<<1].rv;
		t[p<<1|1].used1^=1;
		t[p<<1|1].lv=!t[p<<1|1].lv;
		t[p<<1|1].rv=!t[p<<1|1].rv;
		if(t[p<<1].used==1) t[p<<1].over^=1;
		if(t[p<<1|1].used==1) t[p<<1|1].over^=1;
	}
	t[p].used=t[p].over=t[p].used1=0;
}
inline void change(int p,int l,int r,int opt){
		spread(p);
	if(l<=t[p].l&&r>=t[p].r){
		t[p].lv=t[p].rv=opt;
		t[p].sum=t[p].value=t[p].ll=t[p].rl=(t[p].r-t[p].l+1)*opt;
		t[p].sum0=t[p].value0=t[p].l0=t[p].r0=(t[p].r-t[p].l+1)*!opt;
		t[p].over=opt;
		t[p].used=1;
		return;
	}
	spread(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) change(p<<1,l,r,opt);
	if(r>mid) change(p<<1|1,l,r,opt);
	pushup(p);
}
inline void change1(int p,int l,int r){
	spread(p);
	if(l<=t[p].l&&r>=t[p].r){
		swap(t[p].sum,t[p].sum0);
		swap(t[p].ll,t[p].l0);
		swap(t[p].rl,t[p].r0);
		swap(t[p].value,t[p].value0);
		if(t[p].used==1) t[p].over^=1;
		t[p].used1^=1;
		t[p].lv=!t[p].lv;
		t[p].rv=!t[p].rv;
		return;
	}
	spread(p);
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) change1(p<<1,l,r);
	if(r>mid) change1(p<<1|1,l,r);
	spread(p);
	pushup(p);
} 
inline int ask(int p,int l,int r){
		spread(p);
	if(l<=t[p].l&&r>=t[p].r){
		return t[p].value;
	}
	spread(p);
	int ans=0;
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid) ans+=ask(p<<1,l,r);
	if(r>mid) ans+=ask(p<<1|1,l,r);
	return ans; 
}
struct op{
	int sum,ll,rl;
	int lv,rv;
	int len;
}kong;
inline op ask1(int p,int l,int r){
	spread(p);
	if(l<=t[p].l&&r>=t[p].r){
	//cout<<111111<<' '<<t[p].l<<' '<<t[p].r<<' '<<t[p].sum<<' '<<t[p].lv<<' '<<t[p].rv<<endl;
		return  (op){t[p].sum,t[p].ll,t[p].rl,t[p].lv,t[p].rv,t[p].len};
	}
	spread(p);
	op temp=kong,temp1=kong,pp=kong;
	int mid=t[p].l+t[p].r>>1;
	if(l<=mid){
		temp=ask1(p<<1,l,r);
	}
		spread(p);
	if(r>mid){
		temp1=ask1(p<<1|1,l,r);
	}
//	cout<<2<<' '<<temp.sum<<' '<<temp1.sum<<endl;
	pp.lv=temp.lv;
	pp.rv=temp1.rv;
	if(temp.rv&&temp1.lv){
		pp.sum=max(temp.sum,max(temp1.sum,temp.rl+temp1.ll));
		if(temp.ll==temp.len) pp.ll=temp.ll+temp1.ll;
		else pp.ll=temp.ll;
		if(temp1.rl==temp1.len) pp.rl=temp1.rl+temp.rl;
		else pp.rl=temp1.rl;
	}else {
		pp.sum=max(temp.sum,temp1.sum);
		pp.ll=temp.ll;
		pp.rl=temp1.rl;
	}
/*	if(!temp.rv&&!temp1.lv){
		pp.sum=max(temp.sum0,max(temp1.sum0,temp.r0+temp1.l0));
		if(temp.l0==temp.len) pp.ll=temp.l0+temp1.l0;
		else pp.l0=temp.l0;
		if(temp1.r0==temp1.len) pp.r0=temp1.r0+temp.r0;
		else pp.r0=temp1.r0;
	}else {
		pp.sum0=max(temp.sum0,temp1.sum0);
		pp.l0=temp.l0;
		pp.r0=temp1.r0;
	}
	pp.len=temp.len+temp1.len;*/
//	cout<<pp.l<<' '<<t[p].r<<' '<<p<<' '<<pp.sum<<' '<<pp.ll<<' '<<pp.rl<<endl; 
	return pp;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	int opt,l,r;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&opt,&l,&r);
		l++;
		r++;
		if(opt==0){
			change(1,l,r,opt);
		}else if(opt==1){
			change(1,l,r,opt);
		}else if(opt==2){
			change1(1,l,r);
		}else if(opt==3){
			printf("%d\n",ask(1,l,r));
		}else{
			printf("%d\n",ask1(1,l,r).sum);
		}
	}
	return 0;
}
2024/9/22 20:31
加载中...