hdu4553

hdu4553

 

/*
hdu4553 
维护 两个线段树,分别是屌丝和女神,其他的都和hdu1540差不多吧 
*/

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
void pushdown(int num,int cnt);
int cas=1; 
struct node
{
	int le,ri,pre[2],suf[2],maxn[2],cover[2];
}tree[400005];
void build(int L,int R,int num)
{
	tree[num].le=L;
	tree[num].ri=R;
	tree[num].pre[0]=tree[num].pre[1]=R-L+1;
	tree[num].suf[0]=tree[num].suf[1]=R-L+1;
	tree[num].maxn[0]=tree[num].maxn[1]=R-L+1;
	tree[num].cover[1]=tree[num].cover[0]=-1;
	if(L==R)
	{
		return;
	}
	int mid=(L+R)/2;
	build(L,mid,num*2);
	build(mid+1,R,num*2+1);
}

int ask(int num,int T,int cnt)
{
	if(tree[num].le==tree[num].ri)return tree[num].le;
	pushdown(num,cnt);
	if(tree[num*2].maxn[cnt]>=T)
	{
		return ask(num*2,T,cnt);
	}
	if(tree[num*2].suf[cnt]+tree[num*2+1].pre[cnt]>=T)
	{
		 return tree[num*2].ri-tree[num*2].suf[cnt]+1;
	} 
	else
	{
		return ask(num*2+1,T,cnt);
	}
}

void pushdown(int num,int cnt)
{
	if(tree[num].cover[cnt]!=-1)
	{
		if(!tree[num].cover[cnt])
		{
			tree[num*2].cover[cnt]=tree[num*2+1].cover[cnt]=0;
			tree[num*2].pre[cnt]=tree[num*2+1].pre[cnt]=0;
			tree[num*2].suf[cnt]=tree[num*2+1].suf[cnt]=0;
			tree[num*2].maxn[cnt]=tree[num*2+1].maxn[cnt]=0;
			tree[num].cover[cnt]=-1;
		}
		else
		{
			tree[num*2].cover[cnt]=tree[num*2+1].cover[cnt]=tree[num].cover[cnt];
			tree[num*2].suf[cnt]=tree[num*2].pre[cnt]=tree[num*2].maxn[cnt]=tree[num*2].ri-tree[num*2].le+1;
			tree[num*2+1].suf[cnt]=tree[num*2+1].pre[cnt]=tree[num*2+1].maxn[cnt]=tree[num*2+1].ri-tree[num*2+1].le+1;
			tree[num].cover[cnt]=-1;
		}
	}
}

void pushup(int num,int cnt)
{
	tree[num].maxn[cnt]=max(tree[num*2].maxn[cnt],tree[num*2+1].maxn[cnt]);
	tree[num].maxn[cnt]=max(tree[num].maxn[cnt],tree[num*2].suf[cnt]+tree[num*2+1].pre[cnt]);
	tree[num].pre[cnt]=tree[num*2].pre[cnt];
	tree[num].suf[cnt]=tree[num*2+1].suf[cnt];
	if(tree[num*2].pre[cnt]==tree[num*2].ri-tree[num*2].le+1)
		tree[num].pre[cnt]+=tree[num*2+1].pre[cnt];
	if(tree[num*2+1].suf[cnt]==tree[num*2+1].ri-tree[num*2+1].le+1)
		tree[num].suf[cnt]+=tree[num*2].suf[cnt];
}

void update(int L,int R,int num,int cnt,int c)
{
	if(L<=tree[num].le&&R>=tree[num].ri)
	{
		if(c==0)
		{
			tree[num].cover[cnt]=0;
			tree[num].pre[cnt]=0;
			tree[num].suf[cnt]=0;
			tree[num].maxn[cnt]=0;
		}
			
		else
		{
			tree[num].pre[cnt]=tree[num].ri-tree[num].le+1;
			tree[num].suf[cnt]=tree[num].ri-tree[num].le+1;
			tree[num].maxn[cnt]=tree[num].ri-tree[num].le+1;
			tree[num].cover[cnt]=c;
		}
		return;
	}
	pushdown(num,cnt);
	int mid=(tree[num].le+tree[num].ri)/2;
	if(L<=mid)update(L,R,num*2,cnt,c);
	if(R>mid)update(L,R,num*2+1,cnt,c);
	pushup(num,cnt);
}

int main()
{
// 	std::ios::sync_with_stdio(false);
	int t,n,m,i,T,R;
	char ss[10];
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&m);
		printf("Case %d:\n",cas++);
		build(1,n,1);
		for(i=0;i<m;i++)
		{//cout<<i<<endl;
			scanf("%s %d",ss,&T);
			if(ss[0]=='D')
			{
				if(tree[1].maxn[0]>=T)
				{
					int temp=ask(1,T,0);
					printf("%d,let's fly\n",temp);
					update(temp,temp+T-1,1,0,0);
//					cout<<"qqqqqqqq"<<endl;
				}
				else printf("fly with yourself\n");
				
			}
			else if(ss[0]=='N')
			{
				if(tree[1].maxn[0]>=T)
				{
					int temp=ask(1,T,0);
					printf("%d,don't put my gezi\n",temp);
					update(temp,temp+T-1,1,0,0);
					update(temp,temp+T-1,1,1,0);
				}
				else if(tree[1].maxn[1]>=T)
				{
					int temp=ask(1,T,1);
					printf("%d,don't put my gezi\n",temp);
					update(temp,temp+T-1,1,0,0);
					update(temp,temp+T-1,1,1,0);
				}
				else
					printf("wait for me\n");
				
			}
			else
			{
				scanf("%d",&R);
				printf("I am the hope of chinese chengxuyuan!!\n");
				update(T,R,1,0,1);
				update(T,R,1,1,1);
			}
		}
	} 

 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值