题解:AT_abc428_c [ABC428C] Brackets Stack Query

· · 题解

首先如果我们将左括号看成一,右括号看成负一,那么当当前前缀和值为零时,便是一个合法的序列。

但是还有一个问题,就是如果有某个位置前缀和为负的话,说明那里一定至少有一个右括号会失配,那么直接记录这个位置就好了。

code

#include <bits/stdc++.h>
using namespace std;

int len, lst, a[800010], sum[800010]; 

int main () {
    int q;
    cin >> q;
    while (q--) {
        int opt;
        char c;
        cin >> opt;
        if (opt == 1) cin >> c, a[++len] = (c == '(' ? 1 : -1), sum[len] = sum[len - 1] + a[len];
        else a[len--] = 0, lst = (len < lst ? 0 : lst);
        if (lst) cout << "No" << endl;
        else {
            if (sum[len] < 0) lst = len, cout << "No" << endl;
            else cout << (sum[len] ? "No" : "Yes") << endl;
        }
    }
    return 0;
}