Submission #884507

#TimeUsernameProblemLanguageResultExecution timeMemory
88450742kangarooBeech Tree (IOI23_beechtree)C++17
13 / 100
282 ms192340 KiB
// D. Beech Tree #include<bits/stdc++.h> #include "beechtree.h" using namespace std; using g_t = vector<vector<int>>; using dVal = pair<map<int, int>, list<set<int>>>; struct ValR { int d, n, co; }; dVal dfs(int n, g_t &g, vector<bool> &po, vector<int> &c) { map<int, int> r; map<int, vector<pair<int, int>>> ve; list<set<int>> se; se.push_back(set<int>()); for (auto e: g[n]) { if (r.find(c[e]) != r.end()) po[n] = false; r[c[e]] = 1; ve[c[e]] = {}; se.back().insert(c[e]); } for (auto e: g[n]) { auto [re, li] = dfs(e, g, po, c); if (!po[e]) { po[n] = false; } if (po[n]) { for (auto &[co, d]: re) { if (r.find(co) == r.end()) { po[n] = false; break; } if (co == c[e]) r[c[e]] = d + 1; ve[co].emplace_back(d, e); } auto itS = se.begin(); for (auto & it : li) { while (itS->size() < it.size()) { for (auto cos: *itS) { if (it.erase(cos) == 0) { po[n] = false; break; } } itS++; } if (!it.empty()) { auto act = itS; itS = se.insert(itS, {}); for (auto cos: it) { if (act->erase(cos) == 0) { po[n] = false; break; } itS->insert(cos); } } } } } if (!po[n]) return {}; map<int, int> val; vector<ValR> si; for (auto &[co, vec]: ve) { si.push_back({r[co] - 1, 0, co}); si.push_back({r[co], 0, co}); for (auto [d, e]: vec) { val[e] = 0; if (d > r[co]) { po[n] = false; return {}; } else if (d == r[co]) { si.back().n++; si[si.size() - 2].n++; } else if (d == r[co] - 1) { si[si.size() - 2].n++; } } } std::sort(si.begin(), si.end(), [](const ValR &l, const ValR &r) { return l.n > r.n; }); int i = 1; list<set<int>> siO; int last = -1; for (auto v: si) { for (auto [d, e]: ve[v.co]) { if (d >= v.d) { if (val[e] != i - 1) { po[n] = false; return {}; } val[e] = i; } } if (v.d == r[v.co]) { if (v.n > last) { siO.push_front({}); } siO.front().insert(v.co); last = v.n; } i++; } auto itS = se.begin(); for (auto & it : siO) { while (itS->size() < it.size()) { for (auto cos: *itS) { if (it.erase(cos) == 0) { po[n] = false; break; } } itS++; } if (!it.empty()) { auto act = itS; itS = se.insert(itS, {}); for (auto cos: it) { if (act->erase(cos) == 0) { po[n] = false; break; } itS->insert(cos); } } } return {r, se}; } vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) { g_t g(N); for (int i = 1; i < N; ++i) { g[P[i]].push_back(i); } vector<bool> po(N, true); dfs(0, g, po, C); return {po.begin(), po.end()}; }
#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...
#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...