Submission #879417

#TimeUsernameProblemLanguageResultExecution timeMemory
879417SanguineChameleonBeech Tree (IOI23_beechtree)C++17
100 / 100
509 ms118868 KiB
#include "beechtree.h" #include <bits/stdc++.h> using namespace std; vector<set<pair<int, int>>> S; vector<map<int, int>> ch; vector<int> sz; vector<int> res; bool check(int u, int v) { for (auto [c, x]: ch[u]) { auto it = ch[v].find(c); if (it == ch[v].end()) { return false; } if (sz[x] > sz[it->second]) { return false; } } return true; } void calc(int u) { if (res[u] == 0) { return; } sz[u] = 1; for (auto [c, v]: ch[u]) { if (res[v] == 0) { res[u] = 0; return; } sz[u] += sz[v]; } S[u].emplace(sz[u], u); for (auto [c, v]: ch[u]) { if (S[u].size() < S[v].size()) { S[u].swap(S[v]); } for (auto p: S[v]) { auto it = S[u].insert(p).first; if (it != S[u].begin() && !check(prev(it)->second, p.second)) { res[u] = 0; return; } if (next(it) != S[u].end() && !check(p.second, next(it)->second)) { res[u] = 0; return; } } } } vector<int> beechtree(int N, int M, vector<int> P, vector<int> C) { S.resize(N); ch.resize(N); sz.resize(N); res.resize(N, 1); for (int i = 1; i < N; i++) { if (res[P[i]] == 0) { continue; } auto it = ch[P[i]].find(C[i]); if (it != ch[P[i]].end()) { res[P[i]] = 0; } else { ch[P[i]][C[i]] = i; } } for (int i = N - 1; i >= 0; i--) { calc(i); } return res; }
#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...