// clang-format off
#include<bits/stdc++.h>
using namespace std;
using LL=long long;
#define FOR(i,l,r) for(auto i=(l);i<=(r);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) int(x.size())
auto operator<<(ostream&o,auto p)->decltype(p.first,o){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(ostream&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<"}";}
#ifdef DEBUG
#define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n'
#else
#define debug(...) {}
#endif
// clang-format on
struct Tree
{
int level;
int nleafes;
};
struct Node
{
int tree_id;
bool isleaf;
};
int nlevels;
vector<Tree> trees;
vector<int> needed;
Node
makeRoot(int level)
{
trees.push_back({.level = level, .nleafes = 1});
needed[level + 1] -= 1;
return {.tree_id = ssize(trees) - 1, .isleaf = true};
}
Node
makeChild(int level, Node &parent)
{
auto &tree = trees[parent.tree_id];
// Parent is no longer a leaf
if (parent.isleaf) {
parent.isleaf = false;
tree.nleafes -= 1;
needed[level] += 1;
}
// Create a leaf
needed[level + 1] -= 1;
tree.nleafes += 1;
return {.tree_id = parent.tree_id, .isleaf = true};
}
int
main()
{
cin.tie(0)->sync_with_stdio(0);
cin >> nlevels;
needed.resize(nlevels + 1, 0);
// Create the first level
int n;
vector<Node> curr_level, prev_level;
cin >> n;
REP (i, n) curr_level.emplace_back(makeRoot(0));
// Create remaining levels
FOR (level, 1, nlevels - 1) {
swap(curr_level, prev_level);
curr_level.clear();
cin >> n;
REP (i, n) {
int j;
cin >> j;
if (j == 0) curr_level.emplace_back(makeRoot(level));
else curr_level.emplace_back(makeChild(level, prev_level[j - 1]));
}
}
// Add needed agents for trees
debug(needed);
for (const auto &tree : trees) {
needed[tree.level] += tree.nleafes;
debug(tree.level, tree.nleafes);
}
debug(needed);
// Calculate score
int max_needed = needed[0];
FOR (level, 1, nlevels) {
needed[level] += needed[level - 1];
max_needed = max(max_needed, needed[level]);
}
debug(needed);
cout << max_needed << "\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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | // clang-format off #include<bits/stdc++.h> using namespace std; using LL=long long; #define FOR(i,l,r) for(auto i=(l);i<=(r);++i) #define REP(i,n) FOR(i,0,(n)-1) #define ssize(x) int(x.size()) auto operator<<(ostream&o,auto p)->decltype(p.first,o){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(ostream&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<(", ")+2*!i++<<e;return o<<"}";} #ifdef DEBUG #define debug(x...) cerr<<"["#x"]: ",[](auto...$){((cerr<<$<<"; "),...);}(x),cerr<<'\n' #else #define debug(...) {} #endif // clang-format on struct Tree { int level; int nleafes; }; struct Node { int tree_id; bool isleaf; }; int nlevels; vector<Tree> trees; vector<int> needed; Node makeRoot(int level) { trees.push_back({.level = level, .nleafes = 1}); needed[level + 1] -= 1; return {.tree_id = ssize(trees) - 1, .isleaf = true}; } Node makeChild(int level, Node &parent) { auto &tree = trees[parent.tree_id]; // Parent is no longer a leaf if (parent.isleaf) { parent.isleaf = false; tree.nleafes -= 1; needed[level] += 1; } // Create a leaf needed[level + 1] -= 1; tree.nleafes += 1; return {.tree_id = parent.tree_id, .isleaf = true}; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> nlevels; needed.resize(nlevels + 1, 0); // Create the first level int n; vector<Node> curr_level, prev_level; cin >> n; REP (i, n) curr_level.emplace_back(makeRoot(0)); // Create remaining levels FOR (level, 1, nlevels - 1) { swap(curr_level, prev_level); curr_level.clear(); cin >> n; REP (i, n) { int j; cin >> j; if (j == 0) curr_level.emplace_back(makeRoot(level)); else curr_level.emplace_back(makeChild(level, prev_level[j - 1])); } } // Add needed agents for trees debug(needed); for (const auto &tree : trees) { needed[tree.level] += tree.nleafes; debug(tree.level, tree.nleafes); } debug(needed); // Calculate score int max_needed = needed[0]; FOR (level, 1, nlevels) { needed[level] += needed[level - 1]; max_needed = max(max_needed, needed[level]); } debug(needed); cout << max_needed << "\n"; return 0; } |
English