#include <bits/stdc++.h>
using namespace std;
using i64 = int64_t;
using u64 = uint64_t;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int k, n;
cin >> k >> n;
vector<vector<int>> nums(k);
nums[0].assign(n, 0);
for (int i = 1; i < k; i++) {
cin >> n;
nums[i].resize(n);
for (int j = 0; j < n; j++) cin >> nums[i][j];
}
vector<vector<vector<int>>> children(k);
for (int i = 0; i < k; i++) children[i].resize(nums[i].size());
for (int i = 1; i < k; i++) {
for (int j = 0; j < nums[i].size(); j++) {
if (nums[i][j] != 0) {
children[i - 1][nums[i][j] - 1].push_back(j);
}
}
}
vector<vector<i64>> w(k);
for (int i = 0; i < k; i++) w[i].resize(nums[i].size(), 0);
for (int i = k - 1; i >= 0; i--) {
for (int j = 0; j < nums[i].size(); j++) {
if (children[i][j].empty()) {
w[i][j] = 1;
} else {
for (auto c : children[i][j]) {
w[i][j] += w[i + 1][c];
}
}
}
}
i64 left = 0;
i64 ans = 0;
for (int i = 0; i < k; i++) {
for (int j = 0; j < nums[i].size(); j++) {
if (nums[i][j] == 0) {
i64 use = min(left, w[i][j]);
left -= use;
ans += w[i][j] - use;
}
}
for (int j = 0; j < nums[i].size(); j++) {
if (children[i][j].empty()) left += w[i][j];
}
}
cout << ans << "\n";
}
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 | #include <bits/stdc++.h> using namespace std; using i64 = int64_t; using u64 = uint64_t; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int k, n; cin >> k >> n; vector<vector<int>> nums(k); nums[0].assign(n, 0); for (int i = 1; i < k; i++) { cin >> n; nums[i].resize(n); for (int j = 0; j < n; j++) cin >> nums[i][j]; } vector<vector<vector<int>>> children(k); for (int i = 0; i < k; i++) children[i].resize(nums[i].size()); for (int i = 1; i < k; i++) { for (int j = 0; j < nums[i].size(); j++) { if (nums[i][j] != 0) { children[i - 1][nums[i][j] - 1].push_back(j); } } } vector<vector<i64>> w(k); for (int i = 0; i < k; i++) w[i].resize(nums[i].size(), 0); for (int i = k - 1; i >= 0; i--) { for (int j = 0; j < nums[i].size(); j++) { if (children[i][j].empty()) { w[i][j] = 1; } else { for (auto c : children[i][j]) { w[i][j] += w[i + 1][c]; } } } } i64 left = 0; i64 ans = 0; for (int i = 0; i < k; i++) { for (int j = 0; j < nums[i].size(); j++) { if (nums[i][j] == 0) { i64 use = min(left, w[i][j]); left -= use; ans += w[i][j] - use; } } for (int j = 0; j < nums[i].size(); j++) { if (children[i][j].empty()) left += w[i][j]; } } cout << ans << "\n"; } |
English