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