Submission #1218750

#TimeUsernameProblemLanguageResultExecution timeMemory
1218750toast12Homework (CEOI22_homework)C++20
100 / 100
395 ms228896 KiB
#include <bits/stdc++.h>
using namespace std;

vector<int> type, l, r;
vector<vector<int>> adj;
vector<int> leaves;

void dfs(int cur, int p) {
    if (type[cur] == -1) {
        leaves[cur] = 1;
        return;
    }
    for (auto e : adj[cur]) {
        if (e != p) {
            dfs(e, cur);
            leaves[cur] += leaves[e];
        }
    }
    int lc = adj[cur][1];
    int rc = adj[cur][2];
    if (type[cur] == 1) {
        // max
        l[cur] = l[lc]+l[rc];
        r[cur] = max(r[lc]+leaves[rc], r[rc]+leaves[lc]);
    }
    else {
        // min
        l[cur] = min(l[lc], l[rc]);
        r[cur] = r[lc]+r[rc]-1;
    }
}

int main() {
    string s;
    getline(cin, s);
    int n = 0, q = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == 'm') {
            n++;
            i += 3;
        }
        else if (s[i] == '?') {
            n++;
            i++;
            q++;
        }
    }
    adj.resize(2);
    type.resize(2, -1);
    l.resize(2);
    r.resize(2);
    int cur = 1;
    stack<int> st;
    st.push(1);
    adj[1].push_back(1);
    for (int i = 0; i < s.length(); i++) {
        if (s[i] != 'm' && s[i] != '?') continue;
        cur = st.top();
        st.pop();
        if (s[i] == 'm') {
            if (s[i+1] == 'a') type[cur] = 1;
            else type[cur] = 0;
            adj.emplace_back();
            adj[cur].push_back(adj.size()-1);
            adj[adj.size()-1].push_back(cur);
            adj.emplace_back();
            adj[cur].push_back(adj.size()-1);
            adj[adj.size()-1].push_back(cur);
            st.push(adj.size()-1);
            st.push(adj.size()-2);
            l.emplace_back();
            l.emplace_back();
            r.emplace_back();
            r.emplace_back();
            type.push_back(-1);
            type.push_back(-1);
            i += 3;
        }
        else if (s[i] == '?') {
            l[cur] = 1;
            r[cur] = 1;
        }
    }
    leaves.resize(adj.size());
    dfs(1, 1);
    cout << r[1]-l[1]+1 << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...