本地RE,提交AC?
查看原帖
本地RE,提交AC?
768195
ty_mxzhn楼主2023/1/9 11:27

rt,之前WA,下载数据2后发现本地RE,提交AC了。

#include <iostream>
#include <iomanip>
#include <cstdio>
using namespace std;

struct seg{
	int lb;
	int ub;
	int datas;
	int datam;
	int ldat;
	int rdat;
	int tag;
}tr[4*200007];
int n,m,o,l,r,l0,r0,l1,r1;

seg calu(seg ls,seg rs){
	seg tmp;
	tmp.lb=ls.lb;
	tmp.ub=rs.ub;
	tmp.ldat=ls.ldat;
	if(ls.datas==0) tmp.ldat=max((ls.ub-ls.lb+1)+rs.ldat,tmp.ldat);
	tmp.rdat=rs.rdat;
	if(rs.datas==0) tmp.rdat=max((rs.ub-rs.lb+1)+ls.rdat,tmp.rdat);
	tmp.datam=max(ls.rdat+rs.ldat,max(ls.datam,rs.datam));
	tmp.datas=ls.datas+rs.datas;
	tmp.tag=-1;
	return tmp;
}

void pushup(int k){
	tr[k]=calu(tr[k<<1],tr[(k<<1)|1]);
	return;
}

void pushdown(int k){
	int tg=tr[k].tag;
	if(tg==-1)
		return;
	if(tg==0){
		tr[k<<1].rdat=tr[k<<1].ldat=tr[k<<1].datam=tr[k<<1].ub-tr[k<<1].lb+1,tr[k<<1].datas=0;
		tr[(k<<1)|1].rdat=tr[(k<<1)|1].ldat=tr[(k<<1)|1].datam=tr[(k<<1)|1].ub-tr[(k<<1)|1].lb+1,tr[(k<<1)|1].datas=0;
	}
	if(tg==1){
		tr[k<<1].rdat=tr[k<<1].ldat=tr[k<<1].datam=0,tr[k<<1].datas=tr[k<<1].ub-tr[k<<1].lb+1;
		tr[(k<<1)|1].rdat=tr[(k<<1)|1].ldat=tr[(k<<1)|1].datam=0,tr[(k<<1)|1].datas=tr[(k<<1)|1].ub-tr[(k<<1)|1].lb+1;
	}
	tr[k<<1].tag=tr[(k<<1)|1].tag=tg;
	tr[k].tag=-1;
	return;
}

void build(int k,int a,int b){
	tr[k].lb=a;tr[k].ub=b;tr[k].tag=-1;
	if(a==b){
		tr[k].datas=1;
		return;
	}
	int mid=(tr[k].lb+tr[k].ub)>>1;
	build(k<<1,a,mid);
	build((k<<1)|1,mid+1,b);
	pushup(k);
}

void upd(int k,int a,int b,int x){
	if(a<=tr[k].lb&&tr[k].ub<=b){
		//pushdown(k);
		if(x==0)
			tr[k].rdat=tr[k].ldat=tr[k].datam=tr[k].ub-tr[k].lb+1,tr[k].datas=0;
		if(x==1)
			tr[k].rdat=tr[k].ldat=tr[k].datam=0,tr[k].datas=tr[k].ub-tr[k].lb+1;
		tr[k].tag=x;
		return;
	}
	pushdown(k);
	int mid=(tr[k].lb+tr[k].ub)>>1;
	if(a<=mid) upd(k<<1,a,b,x);
	if(b>mid)  upd((k<<1)|1,a,b,x);
	pushup(k); 
}

seg query(int k,int a,int b){
	if(a<=tr[k].lb&&tr[k].ub<=b){
		return tr[k];
	}
	pushdown(k); 
	int mid=(tr[k].lb+tr[k].ub)>>1;
	//pushup(k);
	if(a<=mid&&b>mid){
		return calu(query(k<<1,a,b),query((k<<1)|1,a,b));
	}
	if(a<=mid) return query(k<<1,a,b);
	if(b>mid)  return query((k<<1)|1,a,b);
}

signed main(){
	//freopen("P4344_2.in","r",stdin),freopen("std_2.out","w",stdout);
	scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int j=1;j<=m;j++){
		scanf("%d",&o);
		if(o==0){
			scanf("%d%d",&l,&r);
			upd(1,l,r,0);
		}
		if(o==1){
			scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
			int s0=(query(1,l0,r0)).datas;
			if(s0==0) continue;
			upd(1,l0,r0,0);
			//printf("%lld\n",s0);
			int lb=l1,ub=r1,ans;
			while(lb<=ub){
				//printf("%lld %lld\n",lb,ub);
				int mid=(lb+ub)>>1;
				int sq=(query(1,l1,mid)).datas;
				int fuls=mid-l1+1;
				if((fuls-sq)<=s0)
					ans=mid,lb=mid+1;
				else
					ub=mid-1;
			}
			upd(1,l1,ans,1);
		}
		if(o==2){
			scanf("%d%d",&l,&r);
			seg q=query(1,l,r);
			printf("%d\n",q.datam);
		}
	}
	return 0;
}
2023/1/9 11:27
加载中...