社区讨论

WA60分求调

P4344[SHOI2015] 脑洞治疗仪参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mkm0uf0w
此快照首次捕获于
2026/01/20 11:15
4 周前
此快照最后确认于
2026/01/20 14:02
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+20;
int n,T;
struct Brain{
	int l,r,len,lmax,rmax,ans,lazy,sum;
}z[N*4];
void pushup(int x){
	z[x].sum=z[x<<1].sum+z[x<<1|1].sum;
	if(z[x<<1].lmax!=z[x<<1].len) z[x].lmax=z[x<<1].lmax;
	else z[x].lmax=z[x<<1].lmax+z[x<<1|1].lmax;
	if(z[x<<1|1].rmax!=z[x<<1|1].len) z[x].rmax=z[x<<1|1].rmax;
	else z[x].rmax=z[x<<1|1].rmax+z[x<<1].rmax;
	z[x].ans=max(max(z[x<<1].ans,z[x<<1|1].ans),z[x<<1].rmax+z[x<<1|1].lmax);
}
void build(int l,int r,int x){
	z[x].l=l,z[x].r=r;
	z[x].len=r-l+1;
	z[x].ans=z[x].lazy=0;
	if(l==r){
		z[x].lmax=z[x].rmax=0;
		z[x].sum=1;
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,x<<1),build(mid+1,r,x<<1|1);
	pushup(x);
}
void pushdown(int x){
	if(!z[x].lazy) return ;
	if(z[x].lazy==1){
		z[x<<1].sum=z[x<<1|1].sum=0;
		z[x<<1].lmax=z[x<<1].rmax=z[x<<1].ans=z[x<<1].len;
		z[x<<1|1].lmax=z[x<<1|1].rmax=z[x<<1|1].ans=z[x<<1|1].len;
		z[x<<1].lazy=z[x<<1|1].lazy=1;
		z[x].lazy=0;
		return ;
	}
	if(z[x].lazy==2){
		z[x<<1].sum=z[x<<1].len;
		z[x<<1|1].sum=z[x<<1|1].len;
		z[x<<1].lmax=z[x<<1|1].lmax=z[x<<1].rmax=z[x<<1|1].rmax=z[x<<1].ans=z[x<<1|1].ans=0;
		z[x<<1].lazy=z[x<<1|1].lazy=2;
		z[x].lazy=0;
		return ;
	}
}
void change0(int l,int r,int x){
	if(z[x].l>=l&&z[x].r<=r){
		z[x].lazy=1;
		z[x].ans=z[x].lmax=z[x].rmax=z[x].len;
		z[x].sum=0;
		return ;
	}
	pushdown(x);
	int mid=z[x].l+z[x].r>>1;
	if(l<=mid) change0(l,r,x<<1);
	if(r>mid) change0(l,r,x<<1|1);
	pushup(x);
}
void change1(int l,int r,int x){
	if(z[x].l>=l&&z[x].r<=r){
		z[x].lazy=2;
		z[x].ans=z[x].lmax=z[x].rmax=0;
		z[x].sum=z[x].len;
		return ;
	}
	pushdown(x);
	int mid=z[x].l+z[x].r>>1;
	if(l<=mid) change1(l,r,x<<1);
	if(r>mid) change1(l,r,x<<1|1);
	pushup(x);
}
int query0(int l,int r,int x){
	if(z[x].l>=l&&z[x].r<=r){
		return z[x].ans;
	}
	pushdown(x);
	int mid=z[x].l+z[x].r>>1;
	if(z[x<<1].r<l) return query0(l,r,x<<1|1);
	if(z[x<<1|1].l>r) return query0(l,r,x<<1);
	return max(max(query0(l,r,x<<1),query0(l,r,x<<1|1)),min(z[x<<1].rmax,z[x<<1|1].l-l)+min(z[x<<1|1].lmax,r-z[x<<1].r));
}
int query1(int l,int r,int x){
	if(z[x].l>=l&&z[x].r<=r){
		return z[x].sum;
	}
	pushdown(x);
	int mid=z[x].l+z[x].r>>1,ans=0;
	if(l<=mid) ans=query1(l,r,x<<1);
	if(r>mid) ans+=query1(l,r,x<<1|1);
	return ans;
}
int opt,l,r,ll,rr;
signed main(){
	cin>>n>>T;
	build(1,n,1);
	while(T--){
		cin>>opt;
		if(opt==0){
			cin>>l>>r;
			change0(l,r,1);
		}
		if(opt==1){
			cin>>l>>r>>ll>>rr;
			int p=query1(l,r,1),L=ll,R=-1;
			if(p<=0) continue;
			change0(l,r,1);
			while(ll<=rr){
				int mid=ll+rr>>1;
				if(query0(L,mid,1)<=p){
					ll=mid+1,R=mid;
				}
				else{
					rr=mid-1;
				}
			}
			//cout<<p<<" "<<L<<" "<<R<<"\n";
			if(R!=-1&&R>=L) change1(L,R,1);
			
		}
		if(opt==2){
			cin>>l>>r;
			cout<<query0(l,r,1)<<"\n";
		}
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...