codeforces 508E Arthur and Brackets(贪心)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载,欢迎添加友链。 https://blog.csdn.net/zzk_233/article/details/83267820

这道题看懂题用了一会,要求的就是对于每一个左括号,都要有一个右括号在他给的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;
}

猜你喜欢

转载自blog.csdn.net/zzk_233/article/details/83267820