刚学线段树1秒钟的蒟蒻8pts求调qwq
查看原帖
刚学线段树1秒钟的蒟蒻8pts求调qwq
378706
MoyunAllgorithm楼主2022/11/21 12:53
#include <bits/stdc++.h>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int MAXN=50005;
struct SegmentTree
{
	int emp,lemp,remp;
	int tag;
} tre[MAXN*4];
int N,M;
void PushUp(int rt,int l,int r)
{
	int len=r-l+1,llen=((l+r)>>1)-l+1,rlen=r-((l+r)>>1);
	tre[rt].emp=max(tre[lson].remp+tre[rson].lemp,max(tre[lson].emp,tre[rson].emp));
	tre[rt].lemp=(tre[lson].emp==llen)?llen+tre[rson].lemp:tre[lson].lemp;
	tre[rt].remp=(tre[rson].emp==rlen)?rlen+tre[lson].remp:tre[rson].remp;
	return;
}
void Build(int rt,int l,int r)
{
	if(l==r)
	{
	//	printf("Find a Leaf!%d %d %d\n",rt,l,r);
		tre[rt].emp=tre[rt].lemp=tre[rt].remp=1;
		return;
	}
	int mid=(l+r)>>1;
	Build(lson,l,mid);
	Build(rson,mid+1,r);
	PushUp(rt,l,r);
	return;
}
void PushDown(int rt,int l,int r)
{
	if(tre[rt].tag==1)//stay
	{
		tre[lson].emp=tre[rson].emp=tre[rt].emp=0;
		tre[lson].lemp=tre[rson].lemp=tre[rt].lemp=0;
		tre[lson].remp=tre[rson].remp=tre[rt].remp=0;
		tre[lson].tag=tre[rson].tag=1;
	}
	if(tre[rt].tag==2)//clear
	{
		int len=r-l+1,llen=((l+r)>>1)-l+1,rlen=r-((l+r)>>1);
		tre[lson].emp=tre[lson].lemp=tre[lson].remp=llen;
		tre[rson].emp=tre[rson].lemp=tre[rson].remp=rlen;
		tre[rt].emp=tre[rt].lemp=tre[rt].remp=len;
		tre[lson].tag=tre[rson].tag=2;
	}
	tre[rt].tag=0;
	return;
}
int Query(int rt,int l,int r,int x)
{
	PushDown(rt,l,r);
	if(l==r) return l;
	int mid=(l+r)>>1;
//	if(x==4) printf("%d %d %d %d %d %d %d %d\n",rt,x,l,r,tre[lson].emp,tre[rson].emp,tre[lson].remp,tre[rson].lemp);
	if(tre[lson].emp>=x) return Query(lson,l,mid,x);
	if(tre[lson].remp+tre[rson].lemp>=x) return mid-tre[lson].remp+1;
	if(tre[rson].emp>=x) return Query(rson,mid+1,r,x);
	return 0;
}
void Update(int rt,int l,int r,int ql,int qr,int x)
{
	PushDown(rt,l,r);
	if(ql<=l&&r<=qr)
	{
		tre[rt].tag=x;
		tre[rt].emp=tre[rt].lemp=tre[rt].remp=((x==1)?0:r-l+1);
		return;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) Update(lson,l,mid,ql,qr,x);
	if(mid<qr) Update(rson,mid+1,r,ql,qr,x);
	PushUp(rt,l,r);
	return;
}
int main()
{
	scanf("%d %d",&N,&M);
	Build(1,1,N);
	while(M--)
	{
		int opt,x,y;
		scanf("%d",&opt);
		if(opt==1)
		{
		//	int x;
			scanf("%d",&x);
			int l=Query(1,1,N,x);
			Update(1,1,N,l,l+x-1,1);
			printf("%d\n",l);
		}
		else
		{
			scanf("%d %d",&x,&y);
			Update(1,1,N,x,y+x-1,2);
		}
	}
	return 0;
}

看讨论区 88 分的都是 pushdown 写错了,但我似乎没有检查出问题?qwq

2022/11/21 12:53
加载中...