Submission #1226159

#TimeUsernameProblemLanguageResultExecution timeMemory
1226159spetrHomework (CEOI22_homework)C++20
53 / 100
339 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;

const int mmod = 998244353;  
#define vb vector<bool>

int n = 0;
struct Node {
    int typ;    // 0 = min, 1 = max
    int rodic;
    int pocet;
    bool list;
    int maximum, minimum;
    int L = -1, R = -1;
    Node(int t, int sz, int r, int b)
      : typ(t), rodic(r), list(b), pocet(0), minimum(0), maximum(0) {}
};
vector<Node> v;
vector<vb> can;

void dfs(int u){
    if (v[u].list){
        v[u].pocet = 1;
    }
    else{
        dfs(v[u].L);
        dfs(v[u].R);
        v[u].pocet = v[v[u].L].pocet + v[v[u].R].pocet;
    }
}

void dfs2(int u){
    if (v[u].list){
        v[u].minimum = v[u].maximum = 1;
        return;
    }
    dfs2(v[u].L);
    dfs2(v[u].R);
    int l = v[u].L, r = v[u].R;
       

    if (v[u].typ == 0){
        v[u].minimum = min(v[l].minimum, v[r].minimum);
        v[u].maximum = v[l].maximum + v[r].maximum-1;
    }
    else{
        v[u].maximum = max(v[l].maximum + v[r].pocet, v[r].maximum + v[l].pocet);
        v[u].minimum = v[l].minimum + v[r].minimum;
    }
    
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string vstup;
    cin >> vstup;

    n = 0;
    for(char c : vstup)
        if (c == '?') n++;

    int pos = 0;

    if (vstup[1] == 'i')       // "min"
        v.emplace_back(0, n, -1, false);
    else                       // "max"
        v.emplace_back(1, n, -1, false);

    for (int i = 4; i < (int)vstup.size(); i++){
        char c = vstup[i];
        if (c == '(') continue;
        if (c == 'm') {
            if (vstup[i+1] == 'i')
                v.emplace_back(0, n, pos, false);
            else
                v.emplace_back(1, n, pos, false);
            int u = v.size() - 1;
            if (v[pos].L == -1) v[pos].L = u; else v[pos].R = u;
            pos = u;
        }
        else if (c == ')' || c == ',') {
            pos = v[pos].rodic;
        }
        else if (c == '?') {
            v.emplace_back(0, n, pos, true);
            int u = v.size() - 1;
            if (v[pos].L == -1) v[pos].L = u; else v[pos].R = u;
            pos = u;
        }
    }



    //--------------------------------------------------------
    int M = v.size();

    can.resize(M, vb(n+1,false));


    dfs(0);
    dfs2(0);

    int cnt = v[0].maximum - v[0].minimum + 1;
    cout << cnt;
    

    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...