codeforces 508E Arthur and Brackets(贪心)

这道题看懂题用了一会,要求的就是对于每一个左括号,都要有一个右括号在他给的l,r区间内才合法,这个区间的定义就是

左括号位置+l≤右括号的位置≤左括号位置+r。

那么其实利用栈,如果目前处理出来的数量已经覆盖到他的l,r区间内,就处理,如果超过了就不合法。

pos[i]表示这个点左括号的位置,ans是答案序列。(我是从0开始,所以关于cnt的判定是不加等的)。

最后不要忘记清空栈。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
int n,cnt,l[605],r[605],pos[605],flag;
char ans[1505];
stack<int>M;
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		while(!M.empty())M.pop();flag=0;
		memset(ans,0,sizeof(ans));cnt=0;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d",&l[i],&r[i]);
			pos[i]=cnt;
			ans[cnt++]='(';
			M.push(i);
			while(!M.empty())
			{
				int u=M.top();
				if(pos[u]+l[u]>cnt)break;
				if(pos[u]+r[u]<cnt)
				{
					flag=1;break;
				}
				ans[cnt++]=')'; 
				M.pop();
			}
		}
		if(!flag&&M.empty())printf("%s\n",ans);
		else printf("IMPOSSIBLE\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值