求条,样例都过不了
查看原帖
求条,样例都过不了
1109550
Fish_Water楼主2024/12/20 19:48
#include<bits/stdc++.h>
#define ls(u) u<<1
#define rs(u) u<<1|1
using namespace std;
const int N=1e5+5;
int n,m,a[N];
struct Tree{
	int l,r;
	int len,sa,sb,la,lb,ra,rb,ma,mb;
	int lz1,lz2;
}t[N*4];
void pushup(Tree &T,Tree L,Tree R){
    T.la= L.lb? L.la:L.sa+R.la;
    T.ra= R.rb? R.ra:R.sa+L.ra;
    T.ma=max(max(L.ma,R.ma),R.la+L.ra);
    T.sa=L.sa+R.sa; 
	T.lb= L.la? L.lb:L.sb+R.lb;
    T.rb= R.ra? R.rb:R.sb+L.rb;
    T.mb=max(max(L.mb,R.mb),R.lb+L.rb);
    T.sb=L.sb+R.sb;
}
void change(Tree &T,int opt){
	if(opt==1){
		T.ma=T.la=T.ra=0;
		T.mb=T.lb=T.rb=T.len;
		T.lz1=1,T.lz2=0;
	}
	else if(opt==2){
		T.mb=T.lb=T.rb=0;
		T.ma=T.la=T.ra=T.len;
		T.lz1=2,T.lz2=0;
	}
	else if(opt==3){
		swap(T.sa,T.sb);
		swap(T.la,T.lb);
		swap(T.ra,T.rb);
		swap(T.ma,T.mb);
		T.lz2^=1;
	}
}
void pushdown(int u){
	Tree L=t[ls(u)];
	Tree R=t[rs(u)];
	if(t[u].lz1==1){
		change(L,1);
		change(R,1);
	}
	else if(t[u].lz1==2){
		change(L,2);
		change(R,2);
	}
	else if(t[u].lz2==1){
		change(L,3);
		change(R,3);
	}
	t[u].lz1=t[u].lz2=0;
}
void build(int u,int l,int r){
	t[u].l=l,t[u].r=r,t[u].len=r-l+1;
	if(l==r){
		if(a[l]) t[u].len=t[u].sa=t[u].la=t[u].ra=t[u].ma=1;
		else t[u].len=t[u].sb=t[u].lb=t[u].rb=t[u].mb=1;
		return;
	}
	int mid=(l+r)/2;
	build(ls(u),l,mid);
	build(rs(u),mid+1,r);
	pushup(t[u],t[ls(u)],t[rs(u)]);
}
void update(int u,int l,int r,int k){
    if(t[u].l>=l&&t[u].r<=r){
    	change(t[u],k);
        return;
    }
	int mid=(t[u].r+t[u].l)>>1;
	pushdown(u); 
    if(l<=mid) update(ls(u),l,r,k);
    if(r>mid) update(rs(u),l,r,k);
    pushup(t[u],t[ls(u)],t[rs(u)]);
}
Tree query(int u,int l,int r){
	if(t[u].l>=l&&t[u].r<=r) return t[u];
	int mid=(t[u].l+t[u].r)>>1;
	pushdown(u);
	if(l<=mid) return query(ls(u),l,r);
    if(r>mid) return query(rs(u),l,r);
    Tree T;
    pushup(T,query(ls(u),l,mid),query(rs(u),mid+1,r));
    return T;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	int opt,l,r;
	for(int i=1;i<=m;i++){
		cin>>opt>>l>>r;
		l++,r++;
		if(opt<3) update(1,l,r,opt+1);
		else if(opt==3) cout<<query(1,l,r).sa<<endl;
		else cout<<query(1,l,r).ma<<endl;
	} 
	return 0;
}
2024/12/20 19:48
加载中...