构造一个长度为 \(2n\) 的合法括号序列,使得对于从左到右的第 \(i\) 个左括号,与它配对的右括号和这个左括号之间的距离在 \([l_i,r_i]\) 之间。
考虑用栈模拟,栈顶括号如果能匹配就一定先匹配,否则会导致失配。
具体地,对于每一个左括号,我们计算出它在序列中能匹配的真实位置,然后在栈顶满足条件时弹栈即可。
#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");
}
}
[CF508E] Arthur and Brackets - 贪心,栈
原文:https://www.cnblogs.com/mollnn/p/13655838.html