#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int k, n1;
cin >> k >> n1;
vector<int> ns(k + 1, 0);
vector<vector<int>> preds(k + 1);
ns[1] = n1;
preds[1].resize(n1); // wszystkie 0 – domyślnie
int max_n = n1;
for (int d = 2; d <= k; ++d) {
int ni;
cin >> ni;
ns[d] = ni;
max_n = max(max_n, ni);
preds[d].resize(ni);
for (int j = 0; j < ni; ++j) {
cin >> preds[d][j];
}
}
max_n += 5;
vector<int> big_child(max_n + 1, 0);
vector<int> big_ver(max_n + 1, 0);
int version = 0;
// ----- reqs od końca -----
vector<vector<int>> reqs(k + 1);
for (int d = k; d >= 1; --d) {
if (d == k) {
reqs[d].assign(ns[d], 1);
} else {
int nprev = ns[d];
for (int i = 1; i <= nprev; ++i) big_child[i] = 0;
for (int j = 0; j < ns[d + 1]; ++j) {
int p = preds[d + 1][j];
if (p > 0) big_child[p] += reqs[d + 1][j];
}
reqs[d].assign(nprev, 1);
for (int m = 1; m <= nprev; ++m) {
int s = big_child[m];
if (s > 0) reqs[d][m - 1] = s;
}
}
}
// ----- new_reqs + num_leaves -----
vector<int> new_req(k + 1, 0);
vector<int> leaves(k + 1, 0);
for (int d = 1; d <= k; ++d) {
// new_req
int nr = 0;
for (int j = 0; j < ns[d]; ++j) {
if (preds[d][j] == 0)
nr += reqs[d][j];
}
new_req[d] = nr;
// leaves
if (d == k) {
leaves[d] = ns[d];
} else {
++version;
int cnt = 0;
for (int j = 0; j < ns[d + 1]; ++j) {
int p = preds[d + 1][j];
if (p > 0 && big_ver[p] != version) {
big_ver[p] = version;
++cnt;
}
}
leaves[d] = ns[d] - cnt;
}
}
// ----- symulacja -----
int pool = 0;
int ans = 0;
for (int d = 1; d <= k; ++d) {
int need = new_req[d];
if (pool < need) {
int add = need - pool;
ans += add;
pool += add;
}
pool -= need;
pool += leaves[d];
}
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 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 | #include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int k, n1; cin >> k >> n1; vector<int> ns(k + 1, 0); vector<vector<int>> preds(k + 1); ns[1] = n1; preds[1].resize(n1); // wszystkie 0 – domyślnie int max_n = n1; for (int d = 2; d <= k; ++d) { int ni; cin >> ni; ns[d] = ni; max_n = max(max_n, ni); preds[d].resize(ni); for (int j = 0; j < ni; ++j) { cin >> preds[d][j]; } } max_n += 5; vector<int> big_child(max_n + 1, 0); vector<int> big_ver(max_n + 1, 0); int version = 0; // ----- reqs od końca ----- vector<vector<int>> reqs(k + 1); for (int d = k; d >= 1; --d) { if (d == k) { reqs[d].assign(ns[d], 1); } else { int nprev = ns[d]; for (int i = 1; i <= nprev; ++i) big_child[i] = 0; for (int j = 0; j < ns[d + 1]; ++j) { int p = preds[d + 1][j]; if (p > 0) big_child[p] += reqs[d + 1][j]; } reqs[d].assign(nprev, 1); for (int m = 1; m <= nprev; ++m) { int s = big_child[m]; if (s > 0) reqs[d][m - 1] = s; } } } // ----- new_reqs + num_leaves ----- vector<int> new_req(k + 1, 0); vector<int> leaves(k + 1, 0); for (int d = 1; d <= k; ++d) { // new_req int nr = 0; for (int j = 0; j < ns[d]; ++j) { if (preds[d][j] == 0) nr += reqs[d][j]; } new_req[d] = nr; // leaves if (d == k) { leaves[d] = ns[d]; } else { ++version; int cnt = 0; for (int j = 0; j < ns[d + 1]; ++j) { int p = preds[d + 1][j]; if (p > 0 && big_ver[p] != version) { big_ver[p] = version; ++cnt; } } leaves[d] = ns[d] - cnt; } } // ----- symulacja ----- int pool = 0; int ans = 0; for (int d = 1; d <= k; ++d) { int need = new_req[d]; if (pool < need) { int add = need - pool; ans += add; pool += add; } pool -= need; pool += leaves[d]; } cout << ans << '\n'; return 0; } |
English