#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+7;
vector<int> g[MAXN];
int backidx[MAXN];
vector<int> id;
int kt[MAXN];
int lvs[MAXN];
int main() {
ios_base::sync_with_stdio(0); cin.tie(0);
int k, n1;
cin >> k >> n1;
int ctr = n1+1;
id.resize(n1);
kt[1] = n1;
for (int i=1; i<=n1; i++) backidx[i] = i, id[i-1] = i;
for (int i=2; i<=k; i++) {
int n;
cin >> n;
kt[i] = n;
vector<int> idnew(n);
for (int j=0; j<n; j++) {
int u;
cin >> u;
if (u == 0) backidx[ctr] = ctr;
else {
backidx[ctr] = backidx[id[u-1]];
g[id[u-1]].push_back(ctr);
}
idnew[j] = ctr;
ctr++;
}
id.swap(idnew);
}
for (int i=1; i<ctr; i++)
if (g[i].size() == 0) lvs[backidx[i]]++;
int res = 0;
int avail = 0;
ctr = 1;
for (int i=1; i<=k; i++) {
int need = 0;
for (int j=0; j<kt[i]; j++) {
if (backidx[ctr] == ctr) {
int req = lvs[ctr];
need += req;
}
ctr++;
}
res += max(0,need-avail);
avail = max(0,avail-need);
ctr -= kt[i];
for (int j=0; j<kt[i]; j++) {
if (g[ctr].size() == 0)
avail++;
ctr++;
}
}
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 | #include <bits/stdc++.h> using namespace std; const int MAXN = 1e6+7; vector<int> g[MAXN]; int backidx[MAXN]; vector<int> id; int kt[MAXN]; int lvs[MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int k, n1; cin >> k >> n1; int ctr = n1+1; id.resize(n1); kt[1] = n1; for (int i=1; i<=n1; i++) backidx[i] = i, id[i-1] = i; for (int i=2; i<=k; i++) { int n; cin >> n; kt[i] = n; vector<int> idnew(n); for (int j=0; j<n; j++) { int u; cin >> u; if (u == 0) backidx[ctr] = ctr; else { backidx[ctr] = backidx[id[u-1]]; g[id[u-1]].push_back(ctr); } idnew[j] = ctr; ctr++; } id.swap(idnew); } for (int i=1; i<ctr; i++) if (g[i].size() == 0) lvs[backidx[i]]++; int res = 0; int avail = 0; ctr = 1; for (int i=1; i<=k; i++) { int need = 0; for (int j=0; j<kt[i]; j++) { if (backidx[ctr] == ctr) { int req = lvs[ctr]; need += req; } ctr++; } res += max(0,need-avail); avail = max(0,avail-need); ctr -= kt[i]; for (int j=0; j<kt[i]; j++) { if (g[ctr].size() == 0) avail++; ctr++; } } cout << res << "\n"; } |
English