#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int k, n1;
if (!(cin >> k >> n1)) return 0;
vector<vector<int>> P(k + 1);
vector<vector<long long>> req(k + 1);
vector<vector<bool>> is_leaf(k + 1);
P[1].assign(n1 + 1, 0);
req[1].assign(n1 + 1, 0);
is_leaf[1].assign(n1 + 1, true);
for (int i = 2; i <= k; i++) {
int ni;
cin >> ni;
P[i].assign(ni + 1, 0);
req[i].assign(ni + 1, 0);
is_leaf[i].assign(ni + 1, true);
for (int j = 1; j <= ni; j++) {
cin >> P[i][j];
if (P[i][j] > 0)
is_leaf[i - 1][P[i][j]] = false;
}
}
for (int i = k; i >= 1; i--) {
for (int j = 1; j <= req[i].size() - 1; j++) {
if (req[i][j] == 0)
req[i][j] = 1;
if (i > 1 && P[i][j] > 0)
req[i - 1][P[i][j]] += req[i][j];
}
}
long long E = 0;
long long F = 0;
for (int i = 1; i <= k; i++) {
long long N_i = 0;
if (i == 1)
for (int j = 1; j <= n1; j++)
N_i += req[1][j];
else {
for (int j = 1; j <= req[i].size() - 1; j++)
if (P[i][j] == 0)
N_i += req[i][j];
}
if (N_i > F) {
E += (N_i - F);
F = 0;
} else
F -= N_i;
for (int j = 1; j <= req[i].size() - 1; j++)
if (is_leaf[i][j])
F++;
}
cout << E << "\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 | #include <iostream> #include <vector> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int k, n1; if (!(cin >> k >> n1)) return 0; vector<vector<int>> P(k + 1); vector<vector<long long>> req(k + 1); vector<vector<bool>> is_leaf(k + 1); P[1].assign(n1 + 1, 0); req[1].assign(n1 + 1, 0); is_leaf[1].assign(n1 + 1, true); for (int i = 2; i <= k; i++) { int ni; cin >> ni; P[i].assign(ni + 1, 0); req[i].assign(ni + 1, 0); is_leaf[i].assign(ni + 1, true); for (int j = 1; j <= ni; j++) { cin >> P[i][j]; if (P[i][j] > 0) is_leaf[i - 1][P[i][j]] = false; } } for (int i = k; i >= 1; i--) { for (int j = 1; j <= req[i].size() - 1; j++) { if (req[i][j] == 0) req[i][j] = 1; if (i > 1 && P[i][j] > 0) req[i - 1][P[i][j]] += req[i][j]; } } long long E = 0; long long F = 0; for (int i = 1; i <= k; i++) { long long N_i = 0; if (i == 1) for (int j = 1; j <= n1; j++) N_i += req[1][j]; else { for (int j = 1; j <= req[i].size() - 1; j++) if (P[i][j] == 0) N_i += req[i][j]; } if (N_i > F) { E += (N_i - F); F = 0; } else F -= N_i; for (int j = 1; j <= req[i].size() - 1; j++) if (is_leaf[i][j]) F++; } cout << E << "\n"; return 0; } |
English