#include <bits/stdc++.h>
using namespace std;
#define loop(i, a, b) for(int i = a; i <= b; i++)
#define loop_rev(i, a, b) for(int i = a; i >= b; i--)
#define all(x) x.begin(), x.end()
#define sz(x) int(x.size())
#define eb emplace_back
#define pb push_back
using ui = uint32_t;
using ll = int64_t;
vector<vector<int>> cnt, mind;
vector<int> sizes;
int main() {
cin.tie(0)->sync_with_stdio(0);
int k, n; cin >> k >> n;
sizes.resize(k + 1);
cnt.resize(k + 1);
mind.resize(k + 1);
// level 1
cnt[1].resize(n + 1);
mind[1].resize(n + 1, 1);
sizes[1] = n;
for(int i = 2; i <= k; i++) {
int c; cin >> c;
sizes[i] = c;
cnt[i].resize(c + 1);
mind[i].resize(c + 1);
for(int j = 1; j <= c; j++) {
int v; cin >> v;
if(v == 0) {
mind[i][j] = i;
}
else {
mind[i][j] = mind[i - 1][v];
++cnt[i - 1][v];
}
}
}
multiset<int> free;
free.insert(-1e9);
int res = 0;
for(int w = 1; w <= k; w++) {
for(int i = 1; i <= sizes[w]; i++) {
if(cnt[w][i] == 0) {
auto it = --free.upper_bound(mind[w][i]);
if(*it != -1e9 && *it <= mind[w][i]) {
free.erase(it);
}
else {
++res;
}
free.insert(w + 1);
}
}
}
cout << res << '\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 64 65 66 67 68 | #include <bits/stdc++.h> using namespace std; #define loop(i, a, b) for(int i = a; i <= b; i++) #define loop_rev(i, a, b) for(int i = a; i >= b; i--) #define all(x) x.begin(), x.end() #define sz(x) int(x.size()) #define eb emplace_back #define pb push_back using ui = uint32_t; using ll = int64_t; vector<vector<int>> cnt, mind; vector<int> sizes; int main() { cin.tie(0)->sync_with_stdio(0); int k, n; cin >> k >> n; sizes.resize(k + 1); cnt.resize(k + 1); mind.resize(k + 1); // level 1 cnt[1].resize(n + 1); mind[1].resize(n + 1, 1); sizes[1] = n; for(int i = 2; i <= k; i++) { int c; cin >> c; sizes[i] = c; cnt[i].resize(c + 1); mind[i].resize(c + 1); for(int j = 1; j <= c; j++) { int v; cin >> v; if(v == 0) { mind[i][j] = i; } else { mind[i][j] = mind[i - 1][v]; ++cnt[i - 1][v]; } } } multiset<int> free; free.insert(-1e9); int res = 0; for(int w = 1; w <= k; w++) { for(int i = 1; i <= sizes[w]; i++) { if(cnt[w][i] == 0) { auto it = --free.upper_bound(mind[w][i]); if(*it != -1e9 && *it <= mind[w][i]) { free.erase(it); } else { ++res; } free.insert(w + 1); } } } cout << res << '\n'; } |
English