只过了 hack,看了其他的人的,希望能给出一点建议
查看原帖
只过了 hack,看了其他的人的,希望能给出一点建议
951050
lostxxx楼主2024/10/14 14:53

rt

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q;
ll opt;
ll l,r;
ll a[200100];
struct node{
	ll l,r,len;
	ll l1max,l0max;
	ll r1max,r0max;
	ll sum1,sum0;
	ll max1,max0;
	ll lz1,lz2,lz3;
}tr[400100];
void pushup(ll x){
	if (tr[x<<1].l1max==tr[x<<1].len)
		tr[x].l1max=tr[x<<1].len+tr[x<<1|1].l1max;
	else
		tr[x].l1max=tr[x<<1].l1max;
	if (tr[x<<1|1].r1max==tr[x<<1|1].len)
		tr[x].r1max=tr[x<<1|1].len+tr[x<<1].r1max;
	else
		tr[x].r1max=tr[x<<1|1].r1max;
	if (tr[x<<1].l0max==tr[x<<1].len)
		tr[x].l0max=tr[x<<1].len+tr[x<<1|1].l0max;
	else
		tr[x].l0max=tr[x<<1].l0max;
	if (tr[x<<1|1].r0max==tr[x<<1|1].len)
		tr[x].r0max=tr[x<<1|1].len+tr[x<<1].r0max;
	else
		tr[x].r0max=tr[x<<1|1].r0max;
	tr[x].sum1=tr[x<<1].sum1+tr[x<<1|1].sum1;
	tr[x].sum0=tr[x<<1].sum0+tr[x<<1|1].sum0;
	tr[x].max1=max(tr[x].l1max,max(max(tr[x<<1].max1,max(tr[x<<1|1].max1,tr[x].r1max)),tr[x<<1].r1max+tr[x<<1|1].l1max));
	tr[x].max0=max(tr[x].l0max,max(max(tr[x<<1].max0,max(tr[x<<1|1].max0,tr[x].r0max)),tr[x<<1].r0max+tr[x<<1|1].l0max));
}
void pushdown(ll x){
	if (tr[x].lz1){
		tr[x<<1].sum0=tr[x<<1].len;
		tr[x<<1].sum1=0;
		tr[x<<1].l0max=tr[x<<1].r0max=tr[x<<1].len;
		tr[x<<1].l1max=tr[x<<1].r1max=0;
		tr[x<<1].max0=tr[x<<1].len;
		tr[x<<1].max1=0;
		tr[x<<1|1].sum0=tr[x<<1|1].len;
		tr[x<<1|1].sum1=0;
		tr[x<<1|1].l0max=tr[x<<1|1].r0max=tr[x<<1|1].len;
		tr[x<<1|1].l1max=tr[x<<1|1].r1max=0;
		tr[x<<1|1].max0=tr[x<<1|1].len;
		tr[x<<1|1].max1=0;
		tr[x<<1].lz1=tr[x<<1|1].lz1=1;
		tr[x].lz1=0;
	}
	if (tr[x].lz2){
		tr[x<<1].sum1=tr[x<<1].len;
		tr[x<<1].sum0=0;
		tr[x<<1].l1max=tr[x<<1].r1max=tr[x<<1].len;
		tr[x<<1].l0max=tr[x<<1].r0max=0;
		tr[x<<1].max1=tr[x<<1].len;
		tr[x<<1].max0=0;
		tr[x<<1|1].sum1=tr[x<<1|1].len;
		tr[x<<1|1].sum0=0;
		tr[x<<1|1].l1max=tr[x<<1|1].r1max=tr[x<<1|1].len;
		tr[x<<1|1].l0max=tr[x<<1|1].r0max=0;
		tr[x<<1|1].max1=tr[x<<1|1].len;
		tr[x<<1|1].max0=0;
		tr[x<<1].lz2=tr[x<<1|1].lz2=1;
		tr[x].lz2=0;
	}
	if (tr[x].lz3){
		swap(tr[x<<1].sum1,tr[x<<1].sum0);
		swap(tr[x<<1].l1max,tr[x<<1].l0max);
		swap(tr[x<<1].r1max,tr[x<<1].r0max);
		swap(tr[x<<1].max1,tr[x<<1].max0);
		swap(tr[x<<1|1].sum1,tr[x<<1|1].sum0);
		swap(tr[x<<1|1].l1max,tr[x<<1|1].l0max);
		swap(tr[x<<1|1].r1max,tr[x<<1|1].r0max);
		swap(tr[x<<1|1].max1,tr[x<<1|1].max0);
		tr[x<<1].lz3=tr[x<<1|1].lz3=1;
		tr[x].lz3=0;
	}
}
void build(ll x,ll l,ll r){
	tr[x].l=l;
	tr[x].r=r;
	tr[x].len=r-l+1;
	if (l==r){
		if (a[l]==1){
			tr[x].l1max=1,tr[x].l0max=0;
			tr[x].r1max=1,tr[x].r0max=0;
			tr[x].sum1=1,tr[x].sum0=0;
			tr[x].max1=1,tr[x].max0=0;
		}else{
			tr[x].l1max=0,tr[x].l0max=1;
			tr[x].r1max=0,tr[x].r0max=1;
			tr[x].sum1=0,tr[x].sum0=1;
			tr[x].max1=0,tr[x].max0=1;
		}
		return;
	}
	ll mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
void change1(ll x,ll l,ll r){
	if (l<=tr[x].l && tr[x].r<=r){
		tr[x].sum0=tr[x].len;
		tr[x].sum1=0;
		tr[x].l0max=tr[x].r0max=tr[x].len;
		tr[x].l1max=tr[x].r1max=0;
		tr[x].max0=tr[x].len;
		tr[x].max1=0;
		tr[x].lz1=1;
		if (tr[x].lz2)
			tr[x].lz2=0;
		return;
	}
	pushdown(x);
	ll mid=(tr[x].l+tr[x].r)>>1;
	if (l<=mid)
		change1(x<<1,l,r);
	if (mid+1<=r)
		change1(x<<1|1,l,r);
	pushup(x);
}
void change2(ll x,ll l,ll r){
	if (l<=tr[x].l && tr[x].r<=r){
		tr[x].sum1=tr[x].len;
		tr[x].sum0=0;
		tr[x].l1max=tr[x].r1max=tr[x].len;
		tr[x].l0max=tr[x].r0max=0;
		tr[x].max1=tr[x].len;
		tr[x].max0=0;
		tr[x].lz2=1;
		if (tr[x].lz1)
			tr[x].lz1=0;
		return;
	}
	pushdown(x);
	ll mid=(tr[x].l+tr[x].r)>>1;
	if (l<=mid)
		change2(x<<1,l,r);
	if (mid+1<=r)
		change2(x<<1|1,l,r);
	pushup(x);
}
void change3(ll x,ll l,ll r){
	if (l<=tr[x].l && tr[x].r<=r){
		// cout<<tr[x].l<<" "<<tr[x].r<<endl;
		swap(tr[x].sum1,tr[x].sum0);
		swap(tr[x].l1max,tr[x].l0max);
		swap(tr[x].r1max,tr[x].r0max);
		swap(tr[x].max1,tr[x].max0);
		// cout<<"???  "<<tr[x].sum1<<" "<<tr[x].sum0<<endl;
		tr[x].lz3=1;
		tr[x].lz1^=1;
		tr[x].lz2^=1;
		return;
	}
	pushdown(x);
	ll mid=(tr[x].l+tr[x].r)>>1;
	if (l<=mid)
		change3(x<<1,l,r);
	if (mid+1<=r)	
		change3(x<<1|1,l,r);
	pushup(x);
	// cout<<x<<" "<<tr[x].max1<<endl;
}
ll ask1(ll x,ll l,ll r){
	if (l<=tr[x].l && tr[x].r<=r){
		return tr[x].sum1;
	}
	pushdown(x);
	ll mid=(tr[x].l+tr[x].r)>>1;
	ll res=0;
	if (l<=mid)
		res+=ask1(x<<1,l,r);
	if (mid+1<=r)
		res+=ask1(x<<1|1,l,r);
	return res;
}
node ask2(ll x,ll l,ll r){
	if (l<=tr[x].l && tr[x].r<=r){
		return tr[x];
	}
	pushdown(x);
	ll mid=(tr[x].l+tr[x].r)>>1;
	if (r<=mid)
		return ask2(x<<1,l,r);
	else if (mid+1<=l)
		return ask2(x<<1|1,l,r);
	else{
		node a=ask2(x<<1,l,r);
		node b=ask2(x<<1|1,l,r);
		node c;
		c.l1max=c.r1max=c.l0max=c.r0max=0;
		c.sum1=c.sum0=0;
		c.max1=c.max0=0;
		if (a.l1max==a.len)
			c.l1max=a.len+b.l1max;
		else
			c.l1max=a.l1max;
		if (b.r1max==b.len)
			c.r1max=b.len+a.r1max;
		else
			c.r1max=b.r1max;
		if (a.l0max==a.len)
			c.l0max=a.len+b.l0max;
		else
			c.l0max=a.l0max;
		if (b.r0max==b.len)
			c.r0max=b.len+a.r0max;
		else
			c.r0max=b.r0max;
		c.sum1=a.sum1+b.sum1;
		c.sum0=a.sum0+b.sum0;
		c.max1=max(c.l1max,max(max(a.max1,max(b.max1,c.r1max)),a.r1max+b.l1max));
		c.max0=max(c.l0max,max(max(a.max0,max(b.max0,c.r0max)),a.r0max+b.l0max));
		return c;
	}
}
int main(){
	cin>>n>>q;
	for (int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	// cout<<ask2(1,3,10).max1<<endl;
	while(q--){
		cin>>opt>>l>>r;
		opt++;
		l++;
		r++;
		if (opt==1){
			change1(1,l,r);
		}else if (opt==2){
			change2(1,l,r);
		}else if (opt==3){
			change3(1,l,r);
		}else if (opt==4){
			cout<<ask1(1,l,r)<<endl;
		}else{
			cout<<ask2(1,l,r).max1<<endl;
		}
		// cout<<"TEST: "<<ask1(1,1,10)<<endl;
		// cout<<ask2(1,1,5).max1<<endl;
	}
}
2024/10/14 14:53
加载中...