#include <iostream>
#include <vector>
#include <set>
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int levels; std::cin >> levels;
std::vector<int> level_size(levels);
std::cin >> level_size[0];
std::vector<int> parent(level_size[0], -1);
std::vector<bool> is_a_leaf(level_size[0], true);
std::vector<int> branch(level_size[0]);
for (int i = 0; i < branch.size(); i++) branch[i] = i;
int base = 0;
int branches_cnt = branch.size();
for (int l = 1; l < levels; l++) {
std::cin >> level_size[l];
for (int i = 0; i < level_size[l]; i++) {
int p;
std::cin >> p;
is_a_leaf.push_back(true);
if (p > 0) {
p += base - 1;
parent.push_back(p);
is_a_leaf[p] = false;
branch.push_back(branch[p]);
}
else {
parent.push_back(-1);
branch.push_back(branches_cnt++);
}
}
base += level_size[l-1];
}
std::vector<int> leaves_left(branches_cnt);
for (int i = 0; i < is_a_leaf.size(); i++) leaves_left[branch[i]] += is_a_leaf[i];
// std::cerr << "parent:"; for (auto p : parent) std::cerr << ' ' << p; std::cerr << '\n';
// std::cerr << "branch:"; for (auto p : branch) std::cerr << ' ' << p; std::cerr << '\n';
// std::cerr << "is_a_leaf:"; for (auto p : is_a_leaf) std::cerr << ' ' << p; std::cerr << '\n';
// std::cerr << "leaevs_left:"; for (auto p : leaves_left) std::cerr << ' ' << p; std::cerr << '\n';
int ans = 0;
base = 0;
for (int l = 0; l < levels; l++) {
std::set<int> branches;
for (int i = base; i < base + level_size[l]; i++) branches.insert(branch[i]);
int demand = 0;
for (auto b : branches) demand += leaves_left[b];
ans = std::max(ans, demand);
for (int i = base; i < base + level_size[l]; i++) leaves_left[branch[i]] -= is_a_leaf[i];
base += level_size[l];
}
std::cout << ans << '\n';
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | #include <iostream> #include <vector> #include <set> int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int levels; std::cin >> levels; std::vector<int> level_size(levels); std::cin >> level_size[0]; std::vector<int> parent(level_size[0], -1); std::vector<bool> is_a_leaf(level_size[0], true); std::vector<int> branch(level_size[0]); for (int i = 0; i < branch.size(); i++) branch[i] = i; int base = 0; int branches_cnt = branch.size(); for (int l = 1; l < levels; l++) { std::cin >> level_size[l]; for (int i = 0; i < level_size[l]; i++) { int p; std::cin >> p; is_a_leaf.push_back(true); if (p > 0) { p += base - 1; parent.push_back(p); is_a_leaf[p] = false; branch.push_back(branch[p]); } else { parent.push_back(-1); branch.push_back(branches_cnt++); } } base += level_size[l-1]; } std::vector<int> leaves_left(branches_cnt); for (int i = 0; i < is_a_leaf.size(); i++) leaves_left[branch[i]] += is_a_leaf[i]; // std::cerr << "parent:"; for (auto p : parent) std::cerr << ' ' << p; std::cerr << '\n'; // std::cerr << "branch:"; for (auto p : branch) std::cerr << ' ' << p; std::cerr << '\n'; // std::cerr << "is_a_leaf:"; for (auto p : is_a_leaf) std::cerr << ' ' << p; std::cerr << '\n'; // std::cerr << "leaevs_left:"; for (auto p : leaves_left) std::cerr << ' ' << p; std::cerr << '\n'; int ans = 0; base = 0; for (int l = 0; l < levels; l++) { std::set<int> branches; for (int i = base; i < base + level_size[l]; i++) branches.insert(branch[i]); int demand = 0; for (auto b : branches) demand += leaves_left[b]; ans = std::max(ans, demand); for (int i = base; i < base + level_size[l]; i++) leaves_left[branch[i]] -= is_a_leaf[i]; base += level_size[l]; } std::cout << ans << '\n'; return 0; } |
English