[CF508E] Arthur and Brackets

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");
    }
}

原文地址:https://www.cnblogs.com/mollnn/p/13655838.html