Submission #639526

#TimeUsernameProblemLanguageResultExecution timeMemory
639526MilosMilutinovicHomework (CEOI22_homework)C++14
100 / 100
299 ms233120 KiB
/** * author: wxhtzdy * created: 07.09.2022 19:09:46 **/ #include <bits/stdc++.h> using namespace std; string to_string(string s) { return '"' + s + '"'; } string to_string(const char* s) { return to_string((string) s); } string to_string(bool b) { return (b ? "true" : "false"); } template <typename A, typename B> string to_string(pair<A, B> p) { return "(" + to_string(p.first) + ", " + to_string(p.second) + ")"; } template <typename A> string to_string(A v) { bool first = true; string res = "{"; for (const auto &x : v) { if (!first) { res += ", "; } first = false; res += to_string(x); } res += "}"; return res; } void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << to_string(H); debug_out(T...); } #ifdef LOCAL #define debug(...) cerr << "[" << #__VA_ARGS__ << "]:", debug_out(__VA_ARGS__) #else #define debug(...) 42 #endif int main() { ios::sync_with_stdio(false); cin.tie(0); string s; cin >> s; int len = (int) s.size(); vector<int> stk; vector<int> mat(len); for (int i = 0; i < len; i++) { if (s[i] == '(') { stk.push_back(i); } if (s[i] == ')') { mat[stk.back()] = i; stk.pop_back(); } } int n = 0; for (int i = 0; i < len; i++) { if (s[i] == '?') { n += 1; } } vector<vector<int>> g(2 * n); vector<int> type(2 * n); int T = 0; function<void(int, int, int)> Solve = [&](int L, int R, int idx) { if (L == R) { return; } if (s[L + 1] == 'i') { type[idx] = 0; } else { type[idx] = 1; } T++; g[idx].push_back(T); L = L + 4; if (s[L] != '?') { Solve(L, mat[L + 3], T); L = mat[L + 3] + 2; } else { L += 2; } T++; g[idx].push_back(T); if (s[L] != '?') { Solve(L, R - 1, T); } }; Solve(0, len - 1, 0); vector<int> L(2 * n); vector<int> R(2 * n); vector<int> sz(2 * n); function<void(int)> Dfs = [&](int v) { if (g[v].empty()) { L[v] = R[v] = sz[v] = 1; return; } assert((int) g[v].size() == 2); for (int u : g[v]) { Dfs(u); } sz[v] = sz[g[v][0]] + sz[g[v][1]]; if (type[v] == 0) { L[v] = min(L[g[v][0]], L[g[v][1]]); R[v] = R[g[v][0]] + R[g[v][1]] - 1; } else { L[v] = L[g[v][0]] + L[g[v][1]]; R[v] = max(R[g[v][0]] + sz[g[v][1]], sz[g[v][0]] + R[g[v][1]]); } }; Dfs(0); cout << R[0] - L[0] + 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...