Submission #841404

#TimeUsernameProblemLanguageResultExecution timeMemory
841404model_codeBeech Tree (IOI23_beechtree)C++17
31 / 100
420 ms109216 KiB
// correct/sol_db_twoColors.cpp #include "beechtree.h" #include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() #define xx first #define yy second using namespace std; typedef pair<int, int> pii; const int N = 2e5 + 1; struct Graph { int cnt[N]; bool con[N]; set<pii> srt[N]; vector<int> adj[N][2]; } graph; bool check(int v, int u) { for (int c = 0; c < 2; ++c) { if (graph.adj[v][c].empty()) { continue; } if (graph.adj[u][c].empty()) { return false; } if (graph.cnt[graph.adj[v][c][0]] > graph.cnt[graph.adj[u][c][0]]) { return false; } } return true; } bool insertAndCheck(set<pii> &srt, pii p) { auto [it, st] = srt.insert(p); bool result = true; if (it != srt.begin()) { result &= check(prev(it)->yy, it->yy); } if (next(it) != srt.end()) { result &= check(it->yy, next(it)->yy); } return result; } int dfs(int u) { graph.cnt[u] = 1; graph.con[u] = true; for (int c = 0; c < 2; ++c) { auto &vec = graph.adj[u][c]; graph.con[u] &= vec.size() <= 1; for (int v : vec) { int cnv = dfs(v); if (cnv == -1) { graph.con[u] = false; } else { graph.cnt[u] += cnv; } if (graph.con[u]) { if (graph.srt[v].size() > graph.srt[u].size()) { graph.srt[u].swap(graph.srt[v]); } for (pii p : graph.srt[v]) { graph.con[u] &= insertAndCheck(graph.srt[u], p); } } } } graph.con[u] &= insertAndCheck(graph.srt[u], {graph.cnt[u], u}); return graph.con[u] ? graph.cnt[u] : -1; } vector<int> beechtree(int n, int m, vector<int> P, vector<int> C) { for (int i = 1; i < n; ++i) { int p = P[i]; int c = C[i]; graph.adj[p][c - 1].push_back(i); } dfs(0); vector<int> ans; for (int i = 0; i < n; ++i) ans.push_back(graph.con[i]); return ans; }
#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...