ABC428C

Solution

括号序列用栈写永远是最方便的。
把左右括号当作 $1,-1$。那么一个序列是好的一定满足 $\sum s_i=0$ 且 $\min(\sum_{j=1}^{i} s_j) \ge 0$。
意思就是左右括号的数量要相同,且不能出现右括号在左括号前面的情况。

所以用栈维护这个和和和的最小值,只要满足条件就好了。

Code

#include<bits/stdc++.h>
using namespace std;
int main() {
    int k = 0,mn = 0,q;
    cin >> q;
    vector<pair<int, int>> g;
    for (int i = 1, op; i <= q; i++) {
        cin >> op;
        if (op == 1) {
            char c;
            cin >> c;
            g.push_back({k, mn});
            if (c == '(') {
                k++;
            } else {
                k--;
            }
            mn = min(mn, k);
            
        } else {
            auto tmp = g.back();
            g.pop_back();
            k = tmp.first;
            mn = tmp.second;
        }
        if (k == 0 && mn >= 0) {
            cout << "Yes\n";
        } else {
            cout << "No\n";
        }
    }
    return 0;
}