60分求调T-T (给关注)
查看原帖
60分求调T-T (给关注)
1515284
mengzhixingchen楼主2025/6/19 03:10

已经调了几天了还是调不对T_T

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
const int MOD=998244353;
#define vs void slove()
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define ft for(cin>>t;t--;slove())
#define endl "\n"
typedef long long ll;
ll n,m;
ll a[100005];
struct node{
	ll datayi,lenl,lenr,num,sum,set=-1,Lenl,Lenr,datali;
	ll l,r;
	bool ci=0;
}t[400005];
void build(ll fa,ll l,ll r){
	if(l==r){
		if(a[l]==0){
			t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].l=t[fa].r=0;
			t[fa].Lenl=t[fa].Lenr=t[fa].datali=1;
		}else{
			t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].l=t[fa].r=1;
			t[fa].Lenl=t[fa].Lenr=t[fa].datali=0;
		}
		t[fa].num=1;
		return;
	}
	ll mid=(l+r)/2;
	build(fa<<1,l,mid);
	build(fa<<1|1,mid+1,r);
	t[fa].num=t[fa<<1].num+t[fa<<1|1].num;
	t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
	t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
	if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
		t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
		if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
		else t[fa].lenl=t[fa<<1].lenl;
		if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
		else t[fa].lenr=t[fa<<1|1].lenr;
	}else{
		t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
		t[fa].lenl=t[fa<<1].lenl;
		t[fa].lenr=t[fa<<1|1].lenr;
	}
	if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
		t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
		if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
		else t[fa].Lenl=t[fa<<1].Lenl;
		if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
		else t[fa].Lenr=t[fa<<1|1].Lenr;				
	}else{
		t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
		t[fa].Lenl=t[fa<<1].Lenl;
		t[fa].Lenr=t[fa<<1|1].Lenr;		
	}
}
void push_down(ll fa){
	if(t[fa].set!=-1){
		if(t[fa].set==1){
			t[fa<<1].datayi=t[fa<<1].sum=t[fa<<1].lenl=t[fa<<1].lenr=t[fa<<1].num;
			t[fa<<1|1].datayi=t[fa<<1|1].sum=t[fa<<1|1].lenl=t[fa<<1|1].lenr=t[fa<<1|1].num;
			t[fa<<1].Lenl=t[fa<<1|1].Lenl=t[fa<<1].Lenr=t[fa<<1|1].Lenr=t[fa].datali=0;
		}else{
			t[fa<<1].datayi=t[fa<<1].sum=t[fa<<1].lenl=t[fa<<1].lenr=0;
			t[fa<<1|1].datayi=t[fa<<1|1].sum=t[fa<<1|1].lenl=t[fa<<1|1].lenr=0;	
			t[fa<<1].Lenl=t[fa<<1].Lenr=t[fa<<1].num;
			t[fa<<1|1].Lenl=t[fa<<1|1].Lenr=t[fa].datali=t[fa<<1|1].num;		
		}
		t[fa<<1].l=t[fa<<1].r=t[fa<<1|1].l=t[fa<<1|1].r=t[fa<<1].set=t[fa<<1|1].set=t[fa].set;
		t[fa].set=-1;
		t[fa<<1].ci=t[fa<<1|1].ci=0;
	}
	if(t[fa].ci){
		t[fa<<1].sum=t[fa<<1].num-t[fa<<1].sum;
		t[fa<<1].l^=1,t[fa<<1].r^=1;
		swap(t[fa<<1].datali,t[fa<<1].datayi),swap(t[fa<<1].Lenl,t[fa<<1].lenl),swap(t[fa<<1].Lenr,t[fa<<1].lenr);
		t[fa<<1|1].sum=t[fa<<1|1].num-t[fa<<1|1].sum;
		t[fa<<1|1].l^=1,t[fa<<1|1].r^=1;
		swap(t[fa<<1|1].datali,t[fa<<1|1].datayi),swap(t[fa<<1|1].Lenl,t[fa<<1|1].lenl),swap(t[fa<<1|1].Lenr,t[fa<<1|1].lenr);	
		t[fa<<1].ci=!t[fa<<1].ci,t[fa<<1|1].ci=!t[fa<<1|1].ci;
		t[fa].ci=0;	
	}
}
void update1(ll fa,ll l,ll r,ll ql,ll qr,ll k){
	if(l<=ql&&r>=qr){
		if(k==0){
			t[fa].datayi=t[fa].l=t[fa].r=t[fa].lenl=t[fa].lenr=t[fa].sum=0;
			t[fa].Lenl=t[fa].Lenr=t[fa].datali=t[fa].num;
		}else{
			t[fa].datayi=t[fa].lenl=t[fa].lenr=t[fa].sum=t[fa].num;
			t[fa].l=t[fa].r=1;
			t[fa].Lenl=t[fa].Lenr=t[fa].datali=0;
		}
		t[fa].set=k;
		t[fa].ci=0;
		return;
	}
	ll mid=(ql+qr)/2;
	push_down(fa);
	if(l<=mid)update1(fa<<1,l,r,ql,mid,k);
	if(r>mid)update1(fa<<1|1,l,r,mid+1,qr,k);
	t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
	t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
	if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
		t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
		if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
		else t[fa].lenl=t[fa<<1].lenl;
		if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
		else t[fa].lenr=t[fa<<1|1].lenr;
	}else{
		t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
		t[fa].lenl=t[fa<<1].lenl;
		t[fa].lenr=t[fa<<1|1].lenr;
	}
	if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
		t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
		if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
		else t[fa].Lenl=t[fa<<1].Lenl;
		if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
		else t[fa].Lenr=t[fa<<1|1].Lenr;				
	}else{
		t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
		t[fa].Lenl=t[fa<<1].Lenl;
		t[fa].Lenr=t[fa<<1|1].Lenr;		
	}	
}
void update2(ll fa,ll l,ll r,ll ql,ll qr){
	if(l<=ql&&r>=qr){
		t[fa].sum=t[fa].num-t[fa].sum;
		t[fa].l^=1,t[fa].r^=1;
		swap(t[fa].datali,t[fa].datayi),swap(t[fa].Lenl,t[fa].lenl),swap(t[fa].Lenr,t[fa].lenr);
		t[fa].ci=!t[fa].ci;
		return;		
	}
	ll mid=(ql+qr)/2;
	push_down(fa);
	if(l<=mid)update2(fa<<1,l,r,ql,mid);
	if(r>mid)update2(fa<<1|1,l,r,mid+1,qr);
	t[fa].sum=t[fa<<1].sum+t[fa<<1|1].sum;
	t[fa].l=t[fa<<1].l,t[fa].r=t[fa<<1|1].r;
	if(t[fa<<1].r==1&&t[fa<<1|1].l==1){
		t[fa].datayi=max({t[fa<<1].datayi,t[fa<<1|1].datayi,t[fa<<1].lenr+t[fa<<1|1].lenl});
		if(t[fa<<1].datayi==t[fa<<1].num)t[fa].lenl=t[fa<<1].lenl+t[fa<<1|1].lenl;
		else t[fa].lenl=t[fa<<1].lenl;
		if(t[fa<<1|1].datayi==t[fa<<1|1].num)t[fa].lenr=t[fa<<1|1].lenr+t[fa<<1].lenr;
		else t[fa].lenr=t[fa<<1|1].lenr;
	}else{
		t[fa].datayi=max(t[fa<<1].datayi,t[fa<<1|1].datayi);
		t[fa].lenl=t[fa<<1].lenl;
		t[fa].lenr=t[fa<<1|1].lenr;
	}
	if(t[fa<<1].r==0&&t[fa<<1|1].l==0){
		t[fa].datali=max({t[fa<<1].datali,t[fa<<1|1].datali,t[fa<<1].Lenr+t[fa<<1|1].Lenl});
		if(t[fa<<1].sum==0)t[fa].Lenl=t[fa<<1].Lenl+t[fa<<1|1].Lenl;
		else t[fa].Lenl=t[fa<<1].Lenl;
		if(t[fa<<1|1].sum==0)t[fa].Lenr=t[fa<<1|1].Lenr+t[fa<<1].Lenr;
		else t[fa].Lenr=t[fa<<1|1].Lenr;				
	}else{
		t[fa].datali=max(t[fa<<1].datali,t[fa<<1|1].datali);
		t[fa].Lenl=t[fa<<1].Lenl;
		t[fa].Lenr=t[fa<<1|1].Lenr;		
	}		
}
ll query1(ll fa,ll l,ll r,ll ql,ll qr){
	if(l<=ql&&r>=qr){
		return t[fa].sum;
	}
	ll mid=(ql+qr)/2,ans=0;
	push_down(fa);
	if(l<=mid)ans+=query1(fa<<1,l,r,ql,mid);
	if(r>mid)ans+=query1(fa<<1|1,l,r,mid+1,qr);
	return ans;
}
node query2(ll fa,ll l,ll r,ll ql,ll qr){
	if(l<=ql&&r>=qr)return t[fa];
	push_down(fa);
	ll mid=(ql+qr)/2;
	node ans,ans1,ans2;
	if(l<=mid)ans1=query2(fa<<1,l,r,ql,mid);
	if(r>mid)ans2=query2(fa<<1|1,l,r,mid+1,qr);
	if(l<=mid&&r>mid){
		ans.l=ans1.l,ans.r=ans2.r;
		ans.sum=ans1.sum+ans2.sum;
		ans.num=ans1.num+ans2.num;
		if(ans1.r==1&&ans2.l==1){
			ans.datayi=max({ans1.datayi,ans2.datayi,ans1.lenr+ans2.lenl});
			if(ans1.datayi==ans1.num)ans.lenl=ans1.lenl+ans2.lenl;
			else ans.lenl=ans1.lenl;
			if(ans2.datayi==ans2.num)ans.lenr=ans2.lenr+ans1.lenr;
			else ans.lenr=ans2.lenr;
		}else{
			ans.datayi=max(ans1.datayi,ans2.datayi);
			ans.lenl=ans1.lenl;
			ans.lenr=ans2.lenr;
		}
		return ans;
	}else if(l<=mid)return ans1;
	else if(r>mid)return ans2;
}
void check(){
	for(int i=1;i<=n;i++)cout<<query1(1,i,i,1,n)<<' ';
	cout<<endl;
}
int main(){
    IOS;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    ll type,l,r;
//    check();
    while(m--){
		cin>>type>>l>>r;
		l++,r++;
//		check();
		if(type==1){
			update1(1,l,r,1,n,1);
		}else if(type==2){
			update2(1,l,r,1,n);
		}else if(type==3){
			cout<<query1(1,l,r,1,n)<<endl;
		}else if(type==4){
			cout<<query2(1,l,r,1,n).datayi<<endl;
		}else if(type==0){
			update1(1,l,r,1,n,0);
		}
	}
	return 0;
}
2025/6/19 03:10
加载中...