首页 > 其他 > 详细

[CF508E] Arthur and Brackets - 贪心,栈

时间:2020-09-12 11:12:57      阅读:45      评论:0      收藏:0      [点我收藏+]

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

[CF508E] Arthur and Brackets - 贪心,栈

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!