求助巨佬 样例后两个点都输出7
查看原帖
求助巨佬 样例后两个点都输出7
375337
Silent1019楼主2024/4/14 16:59

RT

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
struct Segment{
	int s0,s1,t_s;
	int l,r,ll,rl,ml;
	bool fg,al0,al1;
}tree[N<<2];
int n,m,s;
int opt,l0,l1,r0,r1;
void build(int p,int l,int r)
{
	if(l==r)
	{
		tree[p].s1=1;
		tree[p].l=1; tree[p].r=1;
		tree[p].fg=false; tree[p].al0=false; tree[p].al1=false;
		return ;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid); build(p<<1|1,mid+1,r);
	tree[p].s1=tree[p<<1].s1+tree[p<<1|1].s1;
	tree[p].l=1; tree[p].r=1;
	tree[p].fg=false;
}
void push(int p,int l,int r)
{
	if(tree[p].al0)
	{
		tree[p<<1].s0+=tree[p<<1].s1;
		tree[p<<1].s1=0;
		tree[p<<1].l=0; tree[p<<1].r=0;
		tree[p<<1].ll=r-l+1; tree[p<<1].rl=r-l+1;
		tree[p<<1].ml=r-l+1;
		tree[p<<1].fg=true; tree[p<<1].al0=true; tree[p<<1].al1=false;
		
		tree[p<<1|1].s0+=tree[p<<1|1].s1;
		tree[p<<1|1].s1=0;
		tree[p<<1|1].l=0; tree[p<<1|1].r=0;
		tree[p<<1|1].ll=r-l+1; tree[p<<1|1].rl=r-l+1;
		tree[p<<1|1].ml=r-l+1;
		tree[p<<1|1].fg=true; tree[p<<1|1].al0=true; tree[p<<1|1].al1=false;
		tree[p].al0=false;
	}
	if(tree[p].al1)
	{
		tree[p<<1].s1+=tree[p<<1].s0;
		tree[p<<1].s0=0;
		tree[p<<1].l=1; tree[p<<1].r=1;
		tree[p<<1].ll=0; tree[p<<1].rl=0;
		tree[p<<1].ml=0;
		tree[p<<1].fg=false; tree[p<<1].al0=false; tree[p<<1].al1=true;
		
		tree[p<<1|1].s1+=tree[p<<1|1].s0;
		tree[p<<1|1].s0=0;
		tree[p<<1|1].l=1; tree[p<<1|1].r=1;
		tree[p<<1|1].ll=0; tree[p<<1|1].rl=0;
		tree[p<<1|1].ml=0;
		tree[p<<1|1].fg=false; tree[p<<1|1].al0=false; tree[p<<1|1].al1=true;
		tree[p].al1=false;
	}
}
void del(int p,int x,int y,int l,int r)
{
	if(x<=l&&r<=y)
	{
		tree[p].s0+=tree[p].s1;
		tree[p].s1=0;
		tree[p].l=0; tree[p].r=0;
		tree[p].ll=r-l+1; tree[p].rl=r-l+1;
		tree[p].ml=r-l+1;
		tree[p].fg=true; tree[p].al0=true; tree[p].al1=false;
		return ;
	}
	push(p,l,r);
	int mid=(l+r)>>1;
	if(mid>=x) del(p<<1,x,y,l,mid);
	if(mid<y) del(p<<1|1,x,y,mid+1,r);

	tree[p].s1=tree[p<<1].s1+tree[p<<1|1].s1;
	tree[p].s0=tree[p<<1].s0+tree[p<<1|1].s0;
	tree[p].l=tree[p<<1].l; tree[p].r=tree[p<<1|1].r;
	if(tree[p<<1].fg) tree[p].ll=tree[p<<1].ll+tree[p<<1|1].ll;
	else tree[p].ll=tree[p<<1].ll;
	if(tree[p<<1|1].fg) tree[p].rl=tree[p<<1].rl+tree[p<<1|1].rl;
	else tree[p].rl=tree[p<<1|1].rl;
	tree[p].ml=max(tree[p<<1].ml,tree[p<<1|1].ml);
	tree[p].ml=max(tree[p].ml,tree[p<<1].rl+tree[p<<1|1].ll);
	if(tree[p<<1].fg&&tree[p<<1|1].fg) tree[p].fg=true;
	else tree[p].fg=false;
}
void ins(int p,int x,int y,int l,int r)
{
	if(x<=l&&r<=y)
	{
		tree[p].s1+=tree[p].s0;
		tree[p].s0=0;
		tree[p].l=1; tree[p].r=1;
		tree[p].ll=0; tree[p].rl=0;
		tree[p].ml=0;
		tree[p].fg=false; tree[p].al0=false; tree[p].al1=true;
		return ;
	}
	push(p,l,r);
	int mid=(l+r)>>1;
	if(mid>=x) ins(p<<1,x,y,l,mid);
	if(mid<y) ins(p<<1|1,x,y,mid+1,r);

	tree[p].s1=tree[p<<1].s1+tree[p<<1|1].s1;
	tree[p].s0=tree[p<<1].s0+tree[p<<1|1].s0;
	tree[p].l=tree[p<<1].l; tree[p].r=tree[p<<1|1].r;
	if(tree[p<<1].fg) tree[p].ll=tree[p<<1].ll+tree[p<<1|1].ll;
	else tree[p].ll=tree[p<<1].ll;
	if(tree[p<<1|1].fg) tree[p].rl=tree[p<<1].rl+tree[p<<1|1].rl;
	else tree[p].rl=tree[p<<1|1].rl;
	tree[p].ml=max(tree[p<<1].ml,tree[p<<1|1].ml);
	tree[p].ml=max(tree[p].ml,tree[p<<1].rl+tree[p<<1|1].ll);
	if(tree[p<<1].fg&&tree[p<<1|1].fg) tree[p].fg=true;
	else tree[p].fg=false;
}
void update(int p,int x,int y,int l,int r)
{
	if(s<=0) return ;
	if(x<=l&&r<=y)
	{
		if(tree[p].s0<=s)
		{
			s-=tree[p].s0;
			ins(1,l,r,1,n);
			return ;
		}
		int mid=(l+r)>>1;
		if(s>0) update(p<<1,x,y,l,mid);
		if(s>0) update(p<<1|1,x,y,mid+1,r);
		return ;
	}
	push(p,l,r);
	int mid=(l+r)>>1;
	if(s>0&&mid>=x) update(p<<1,x,y,l,mid);
	if(s>0&&mid<y) update(p<<1|1,x,y,mid+1,r);
	
	tree[p].s1=tree[p<<1].s1+tree[p<<1|1].s1;
	tree[p].s0=tree[p<<1].s0+tree[p<<1|1].s0;
	tree[p].l=tree[p<<1].l; tree[p].r=tree[p<<1|1].r;
	if(tree[p<<1].fg) tree[p].ll=tree[p<<1].ll+tree[p<<1|1].ll;
	else tree[p].ll=tree[p<<1].ll;
	if(tree[p<<1|1].fg) tree[p].rl=tree[p<<1].rl+tree[p<<1|1].rl;
	else tree[p].rl=tree[p<<1|1].rl;
	tree[p].ml=max(tree[p<<1].ml,tree[p<<1|1].ml);
	tree[p].ml=max(tree[p].ml,tree[p<<1].rl+tree[p<<1|1].ll);
	if(tree[p<<1].fg&&tree[p<<1|1].fg) tree[p].fg=true;
	else tree[p].fg=false;
}
int query_s1(int p,int x,int y,int l,int r)
{
	if(x<=l&&r<=y) return tree[p].s1;
	push(p,l,y);
	int mid=(l+r)>>1,res=0;
	if(mid>=x) res+=query_s1(p<<1,x,y,l,mid);
	if(mid<y) res+=query_s1(p<<1|1,x,y,mid+1,r);
	return res;
}
int query_ml(int p,int x,int y,int l,int r)
{
	if(x<=l&&r<=y) return tree[p].ml;
	push(p,l,y);
	int mid=(l+r)>>1,res=0;
	if(mid>=x) res=max(query_ml(p<<1,x,y,l,mid),res);
	if(mid<y) res=max(query_ml(p<<1|1,x,y,mid+1,r),res);
	return res;
}
int main()
{
	scanf("%d%d",&n,&m);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&opt);
		if(opt==0)
		{
			scanf("%d%d",&l0,&r0);
			del(1,l0,r0,1,n);
		}
		if(opt==1)
		{
			scanf("%d%d%d%d",&l0,&r0,&l1,&r1);
			s=query_s1(1,l0,r0,1,n);
			del(1,l0,r0,1,n);
			update(1,l1,r1,1,n);
		}
		if(opt==2)
		{
			scanf("%d%d",&l0,&r0);
			printf("%d\n",query_ml(1,l0,r0,1,n));
		}
	}
	return 0;
}
2024/4/14 16:59
加载中...