Submission #1014799

#TimeUsernameProblemLanguageResultExecution timeMemory
1014799atomHomework (CEOI22_homework)C++17
100 / 100
192 ms186412 KiB
#include "bits/stdc++.h"
// @JASPER'S BOILERPLATE
using namespace std;
using ll = long long;

#ifdef JASPER
#include "debug.h"
#else
#define debug(...) 166
#endif

const int N = 1e6 + 5;

int n, sz;
string s; 
vector <int> c;

struct Node {
    int t;
    Node *l, *r;
};

Node* make(int& i) {
    Node* cur = new Node;
    if (s[i] == '?') {
        ++i;
        cur->t = 0;
        cur->l = cur->r = nullptr;
        return cur;
    }    

    if (s[i + 1] == 'i') {
        cur->t = -1;
    }
    else {
        cur->t = -2;
    }
    i += 4;
    cur->l = make(i);
    ++i;
    cur->r = make(i);
    ++i;

    return cur;
}
using T = array <int, 3>;
// cnt, up, lo;
T solve(Node* tr) {
    if (tr->t == 0) return {1, 0, 1};
    
    T ql = solve(tr->l);
    T qr = solve(tr->r);
    T res;
    res[0] = ql[0] + qr[0];
    if (tr->t == -1) {
        res[1] = min(ql[1], qr[1]);
        res[2] = ql[2] + qr[2] - 1;
    }
    else {
        res[1] = ql[1] + qr[1] + 1;
        res[2] = res[0] - min(ql[0] - ql[2], qr[0] - qr[2]);
    }
    return res;
}


signed main() {
    cin.tie(0) -> sync_with_stdio(0);
    
    #ifdef JASPER
        freopen("in1", "r", stdin);
    #endif

    cin >> s;
    sz = s.size();
    
    int p = 0;
    Node* tr = make(p);
    T ans = solve(tr);
    cout << (ans[2] - ans[1]) << "\n";

    // if (n >= 9) {
    //     c.resize(n);
    //     iota(c.begin(), c.end(), 1);

    //     vector <int> vals;
    //     do {
    //         vals.push_back(dfs(tr));
    //     } while (next_permutation(c.begin(), c.end()));

    //     sort(vals.begin(), vals.end());
    //     vals.resize(unique(vals.begin(), vals.end()) - vals.begin());

    //     cout << dfs(tr) << "\n";
    // }
    // else {
    //     debug(n);
    //     T ans = solve(tr);
    //     // debug(ans);
    //     // cout << (ans[2] - ans[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...