Description
构造一个长度为 (2n) 的合法括号序列,使得对于从左到右的第 (i) 个左括号,与它配对的右括号和这个左括号之间的距离在 ([l_i,r_i]) 之间。
Solution
考虑用栈模拟,栈顶括号如果能匹配就一定先匹配,否则会导致失配。
具体地,对于每一个左括号,我们计算出它在序列中能匹配的真实位置,然后在栈顶满足条件时弹栈即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,l[N],r[N],opos,s[N],spos;
char o[N];
signed main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>l[i]>>r[i];
}
for(int i=1;i<=n;i++)
{
o[++opos]='(';
s[++spos]=i;
l[i]+=opos;
r[i]+=opos;
while(spos && l[s[spos]]<=opos+1 && r[s[spos]]>=opos+1)
{
--spos;
o[++opos]=')';
}
}
if(opos==2*n)
{
for(int i=1;i<=opos;i++) cout<<o[i];
}
else
{
puts("IMPOSSIBLE");
}
}