// 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, set<int>());
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 = g[n].size() + 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] -1) {
if (v.n < last) {
siO.push_back({});
}
siO.back().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, set<int>());
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 time |
Memory |
Grader output |
1 |
Correct |
1 ms |
552 KB |
Output is correct |
2 |
Incorrect |
1 ms |
348 KB |
2nd lines differ - on the 2nd token, expected: '1', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
2nd lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
2nd lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
1 ms |
348 KB |
2nd lines differ - on the 2nd token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
2nd lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
552 KB |
Output is correct |
2 |
Incorrect |
1 ms |
348 KB |
2nd lines differ - on the 2nd token, expected: '1', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
2nd lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
552 KB |
Output is correct |
2 |
Incorrect |
1 ms |
348 KB |
2nd lines differ - on the 2nd token, expected: '1', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
0 ms |
344 KB |
2nd lines differ - on the 1st token, expected: '1', found: '0' |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
552 KB |
Output is correct |
2 |
Incorrect |
1 ms |
348 KB |
2nd lines differ - on the 2nd token, expected: '1', found: '0' |
3 |
Halted |
0 ms |
0 KB |
- |