特殊思路 TLE #2 ,有没有优化方式
查看原帖
特殊思路 TLE #2 ,有没有优化方式
64976
hewo楼主2021/11/3 18:57

方法就是记录区间最大值,如果一个区间最大值不是0,说明有房间被占了,就跳到最大值+1的点

#include<bits/stdc++.h>

using namespace std;

const int MX=2*100000+1000;
#define LL long long
#define inf 0x3f3f3f3f

#define lson now<<1
#define rson now<<1|1

#define modn 998244353

inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
	while(isdigit(ch)) {x=x*10+ch-48;ch=getchar();}
	return x*f;
}

int n,m;

struct tTree
{
	int maxn;
	int lazytag;
}tree[MX];

inline void pushup(int now)
{
	tree[now].maxn=max(tree[lson].maxn,tree[rson].maxn);
}

inline void pushdown(int now,int l,int r)
{
	int mid=(l+r)>>1;
	if(tree[now].lazytag==1)
	{
		tree[lson].maxn=mid,tree[rson].maxn=r;
		tree[lson].lazytag=tree[rson].lazytag=1;
		tree[now].lazytag=0;
	}
	else if(tree[now].lazytag==-1)
	{
		tree[lson].maxn=tree[rson].maxn=0;
		tree[lson].lazytag=tree[rson].lazytag=-1;
		tree[now].lazytag=0;
	}
}

inline void build(int now,int l,int r)
{
	if(l==r)
	{
		tree[now].maxn=tree[now].lazytag=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(lson,l,mid),build(rson,mid+1,r);
	pushup(now);
}

inline void change(int now,int l,int r,int nl,int nr,int k)
{
	if(nl<=l&&nr>=r)
	{
		if(k==1)
		{
			tree[now].lazytag=1;
			tree[now].maxn=r;
		}
		else if(k==-1)
		{
			tree[now].lazytag=-1;
			tree[now].maxn=0;
		}
		return ;
	}
	pushdown(now,l,r);
	int mid=(l+r)>>1;
	if(nl<=mid) change(lson,l,mid,nl,nr,k);
	if(nr>=mid+1) change(rson,mid+1,r,nl,nr,k);
	pushup(now);
}

inline int get_max(int now,int l,int r,int nl,int nr)
{
	if(nl<=l&&nr>=r)
	{
		return tree[now].maxn;
	}
	pushdown(now,l,r);
	int mid=(l+r)>>1;
	int maxn=-inf;
	if(nl<=mid) maxn=max(maxn,get_max(lson,l,mid,nl,nr));
	if(nr>=mid+1) maxn=max(maxn,get_max(rson,mid+1,r,nl,nr));
	return maxn;
}

int main(int argc, char const *argv[])
{
	freopen("P2894_2.in","r",stdin);
	freopen("P2894_2.out","w",stdout);
	n=read(),m=read();
	build(1,1,n);
	// change(1,1,n,1,n,1);
	// for(int i=1;i<=n;i++)
	// {
	// 	printf("%d\n",get_max(1,1,n,i,i));
	// }
	// change(1,1,n,1,n,-1);
	// printf("%d\n",get_max(1,1,n,1,n));
	while(m--)
	{
		int op;
		op=read();
		if(op==1)
		{
			int x;
			x=read();
			x--;
			int l=1;
			bool flag=0;
			while(l+x<=n)
			{
				int now=get_max(1,1,n,l,l+x);
				//printf("now: %d\n",now);
				if(now==0)
				{
					flag=1;
					printf("%d\n",l);
					change(1,1,n,l,l+x,1);
					break;
				}
				else l=now+1;
			}
			if(!flag) printf("0\n");
		}
		else if(op==2)
		{
			int l,r;
			l=read(),r=read();
			change(1,1,n,l,l+r-1,-1);
			//printf("max: %d\n",get_max(1,1,n,6,6));
		}
	}
	return 0;
}
/*
10 6
1 3
1 3
1 3
1 3
2 5 5
1 6
*/
2021/11/3 18:57
加载中...