Submission #716591

#TimeUsernameProblemLanguageResultExecution timeMemory
716591ArturgoHomework (CEOI22_homework)C++14
100 / 100
261 ms149508 KiB
#include <bits/stdc++.h> using namespace std; struct Vertex { int type, l, r; }; int root = -1; vector<Vertex> vertices; int N = 0; int parse() { char car, useless; cin >> car; if(car == '?') { int id = vertices.size(); vertices.push_back({0, -1, -1}); N++; return id; } cin >> car; cin >> car; cin >> useless; int l = parse(); cin >> useless; int r = parse(); cin >> useless; int id = vertices.size(); if(car == 'x') { vertices.push_back({1, l, r}); } else { vertices.push_back({-1, l, r}); } return id; } struct Ans { int lx_l, lx_g, gx_l, gx_g; }; Ans dyn_ans[2000 * 1000]; Ans calcule_ans(int v) { Ans a; if(vertices[v].type == 0) { a = {1, 0, 0, 1}; } else { Ans ans_l = calcule_ans(vertices[v].l); Ans ans_r = calcule_ans(vertices[v].r); if(vertices[v].type == 1) { a = { ans_l.lx_l + ans_r.lx_l, ans_l.lx_g + ans_r.lx_g, min(ans_l.gx_l, ans_r.gx_l), min(ans_l.gx_g, ans_r.gx_g) }; } else { a = { min(ans_l.lx_l, ans_r.lx_l), min(ans_l.lx_g, ans_r.lx_g), ans_l.gx_l + ans_r.gx_l, ans_l.gx_g + ans_r.gx_g }; } } return dyn_ans[v] = a; } /*void debug(int root) { if(vertices[root].type == 0) { cerr << "?"; return; } if(vertices[root].type == 1) cerr << "max"; else cerr << "min"; cerr << "{"; cerr << dyn_ans[root].lx_l << ","; cerr << dyn_ans[root].lx_g << ","; cerr << dyn_ans[root].gx_l << ","; cerr << dyn_ans[root].gx_g; cerr << "}"; cerr << "("; debug(vertices[root].l); cerr << ","; debug(vertices[root].r); cerr << ")"; }*/ vector<pair<int, int>> inters; void gen_inters(int v, int a = 0, int b = 0) { if(vertices[v].type == 0) { inters.push_back({a, N - b}); } else { if(vertices[v].type == 1) { gen_inters( vertices[v].l, a + dyn_ans[vertices[v].r].lx_l, b + dyn_ans[vertices[v].r].lx_g ); gen_inters( vertices[v].r, a + dyn_ans[vertices[v].l].lx_l, b + dyn_ans[vertices[v].l].lx_g ); } else { gen_inters( vertices[v].l, a + dyn_ans[vertices[v].r].gx_l, b + dyn_ans[vertices[v].r].gx_g ); gen_inters( vertices[v].r, a + dyn_ans[vertices[v].l].gx_l, b + dyn_ans[vertices[v].l].gx_g ); } } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); root = parse(); calcule_ans(root); gen_inters(root); vector<int> vals(N + 1, 0); for(pair<int, int> inter : inters) { vals[inter.first]++; vals[inter.second]--; } int sum = 0; int nbPossibles = 0; for(int i = 0;i < N;i++) { sum += vals[i]; if(sum > 0) nbPossibles++; } cout << nbPossibles << endl; 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...