#include <cstdio>
#include <vector>
using namespace std;
typedef long long ll;
int main() {
int k, n1;
scanf("%d %d", &k, &n1);
vector<int> par(1, 0);
vector<int> day_of(1, 0);
vector<vector<int>> ch(1);
for (int j = 0; j < n1; j++) {
par.push_back(0);
day_of.push_back(1);
ch.push_back({});
}
int prev_start = 1;
int curr_id = n1 + 1;
for (int d = 2; d <= k; d++) {
int nd;
scanf("%d", &nd);
int day_start = curr_id;
for (int j = 0; j < nd; j++) {
int a;
scanf("%d", &a);
int my_id = curr_id++;
int parent_id = (a == 0) ? 0 : (prev_start + a - 1);
par.push_back(parent_id);
day_of.push_back(d);
ch.push_back({});
if (a > 0) {
ch[parent_id].push_back(my_id);
}
}
prev_start = day_start;
}
int N = curr_id - 1;
vector<ll> load(N + 1, 0);
for (int m = N; m >= 1; m--) {
if (ch[m].empty()) {
load[m] = 1;
} else {
for (int c : ch[m]) {
load[m] += load[c];
}
}
}
vector<ll> roots_demand(k + 2, 0);
vector<ll> leaves_supply(k + 2, 0);
for (int m = 1; m <= N; m++) {
int d = day_of[m];
if (par[m] == 0) roots_demand[d] += load[m];
if (ch[m].empty()) leaves_supply[d]++;
}
ll pool = 0, total = 0;
for (int d = 1; d <= k; d++) {
ll used = (pool < roots_demand[d]) ? pool : roots_demand[d];
total += roots_demand[d] - used;
pool = pool - used + leaves_supply[d];
}
printf("%lld\n", total);
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 | #include <cstdio> #include <vector> using namespace std; typedef long long ll; int main() { int k, n1; scanf("%d %d", &k, &n1); vector<int> par(1, 0); vector<int> day_of(1, 0); vector<vector<int>> ch(1); for (int j = 0; j < n1; j++) { par.push_back(0); day_of.push_back(1); ch.push_back({}); } int prev_start = 1; int curr_id = n1 + 1; for (int d = 2; d <= k; d++) { int nd; scanf("%d", &nd); int day_start = curr_id; for (int j = 0; j < nd; j++) { int a; scanf("%d", &a); int my_id = curr_id++; int parent_id = (a == 0) ? 0 : (prev_start + a - 1); par.push_back(parent_id); day_of.push_back(d); ch.push_back({}); if (a > 0) { ch[parent_id].push_back(my_id); } } prev_start = day_start; } int N = curr_id - 1; vector<ll> load(N + 1, 0); for (int m = N; m >= 1; m--) { if (ch[m].empty()) { load[m] = 1; } else { for (int c : ch[m]) { load[m] += load[c]; } } } vector<ll> roots_demand(k + 2, 0); vector<ll> leaves_supply(k + 2, 0); for (int m = 1; m <= N; m++) { int d = day_of[m]; if (par[m] == 0) roots_demand[d] += load[m]; if (ch[m].empty()) leaves_supply[d]++; } ll pool = 0, total = 0; for (int d = 1; d <= k; d++) { ll used = (pool < roots_demand[d]) ? pool : roots_demand[d]; total += roots_demand[d] - used; pool = pool - used + leaves_supply[d]; } printf("%lld\n", total); return 0; } |
English