贪心+构造,CF1153 C. Serval and Parenthesis Sequence

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

Problem - 1153C - Codeforces


二、解题报告

1、思路分析

对于括号匹配问题我们经典做法是左括号当成1,右括号当成-1

那么只要任意前缀非负且最终总和为0那么该括号序列就是合法

对于本题,由于我们要保证任意前缀都不合法,所以任意严格前缀和都是正数(如果出现负数那么说明非法,如果为0则不满足本题要求)

所以前缀和要尽可能大

我们把'?’当成-1,预处理后缀和

遍历序列,如果当前sum + suf[i] < 0,说明我们还需添加左括号

否则添加右括号

如果中途存在sum <= 0且i != n -1说明非法

最后输出前如果sum != 0也说明无解

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

 ​
#include <bits/stdc++.h>
using i64 = long long;
using i128 = __int128;
using PII = std::pair<int, int>;

std::ostream& operator<< (std::ostream& out, i128 x) {
    std::string s;
    while (x) s += ((x % 10) ^ 48), x /= 10;
    std::reverse(s.begin(), s.end());
    return out << s;
}

void solve() {
    int N;
    std::string s;
    std::cin >> N >> s;
    if (N & 1) {
        std::cout << ":(";
        return;
    }
    std::vector<int> suf(N + 1);
    std::unordered_map<char, int> mp;
    mp['('] = 1, mp[')'] = -1, mp['?'] = -1;
    for (int i = N - 1; ~i; i -- ) 
        suf[i] = suf[i + 1] + mp[s[i]];
    int sum = 0;
    for (int i = 0; i < N; i ++ ) {
        if (s[i] == '?') {
            if (sum + suf[i] < 0) sum ++, s[i] = '(';
            else sum --, s[i] = ')';
        }
        else 
            sum += mp[s[i]];
        if (sum <= 0 && i + 1 < N) {
            std::cout << ":(";
            return;
        }
    }
    if (!sum) std::cout << s;
    else std::cout << ":(";
}   

int main(int argc, char** argv) {
    std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
    int _ = 1;
    // std::cin >> _;
    while (_ --)
        solve();
    return 0;
}

相关推荐

  1. CF1898B Milena and Admirer(贪心

    2024-06-13 14:50:03       45 阅读
  2. 构造数字(贪心算法)

    2024-06-13 14:50:03       32 阅读
  3. 【思维构造】Replace With Product—CF1872G

    2024-06-13 14:50:03       40 阅读
  4. CF1869 D2. Candy Party (Easy&Hard Version) [二进制贪心]

    2024-06-13 14:50:03       36 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-13 14:50:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-13 14:50:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-13 14:50:03       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-13 14:50:03       20 阅读

热门阅读

  1. 正则表达式30分钟入门教程

    2024-06-13 14:50:03       12 阅读
  2. MySQL数据类型

    2024-06-13 14:50:03       8 阅读
  3. C语言题目:排序问题2

    2024-06-13 14:50:03       5 阅读
  4. pytest中token的一种处理方法

    2024-06-13 14:50:03       8 阅读
  5. 算法设计与分析复习(第7章 贪心法)

    2024-06-13 14:50:03       7 阅读
  6. redis 故障处理: 持续更新

    2024-06-13 14:50:03       10 阅读