#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false
const int MAXN = 500 * 1000 + 17;
vector<int> a[MAXN];
vector<int> ile[MAXN];
int n[MAXN];
bool kon[MAXN];
int main () {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int k;
cin >> k >> n[1];
for (int i = 0; i <= n[1]; i ++) {
a[1].pb(0);
}
int x;
for (int i = 2; i <= k; i ++) {
cin >> n[i];
a[i].pb(0);
for (int j = 0; j < n[i]; j ++) {
cin >> x;
a[i].pb(x);
}
}
for (int i = 1; i <= k - 1; i ++) {
for (int j = 0; j <= n[i]; j ++) {
ile[i].pb(0);
}
}
for (int j = 0; j <= n[k]; j ++) {
ile[k].pb(1);
}
int wyn = n[k];
int akt = 0;
for (int i = k; i >= 1; i --) {
for (int j = 1; j <= n[i]; j ++) {
if (kon[j]) {
if (akt > 0) {
akt --;
} else {
wyn ++;
}
ile[i][j] = 1;
}
}
for (int j = 1; j <= n[i]; j ++) {
if (a[i][j] == 0) {
akt += ile[i][j];
}
}
if (i != 1) {
for (int j = 1; j <= n[i - 1]; j ++) {
kon[j] = 1;
}
for (int j = 1; j <= n[i]; j ++) {
kon[a[i][j]] = 0;
ile[i - 1][a[i][j]] += ile[i][j];
}
}
}
cout << wyn << "\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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | #include<bits/stdc++.h> #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef long double ld; #define pb push_back #define pii pair<int, int> #define pll pair<ll, ll> #define st first #define nd second #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> #define debug false const int MAXN = 500 * 1000 + 17; vector<int> a[MAXN]; vector<int> ile[MAXN]; int n[MAXN]; bool kon[MAXN]; int main () { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int k; cin >> k >> n[1]; for (int i = 0; i <= n[1]; i ++) { a[1].pb(0); } int x; for (int i = 2; i <= k; i ++) { cin >> n[i]; a[i].pb(0); for (int j = 0; j < n[i]; j ++) { cin >> x; a[i].pb(x); } } for (int i = 1; i <= k - 1; i ++) { for (int j = 0; j <= n[i]; j ++) { ile[i].pb(0); } } for (int j = 0; j <= n[k]; j ++) { ile[k].pb(1); } int wyn = n[k]; int akt = 0; for (int i = k; i >= 1; i --) { for (int j = 1; j <= n[i]; j ++) { if (kon[j]) { if (akt > 0) { akt --; } else { wyn ++; } ile[i][j] = 1; } } for (int j = 1; j <= n[i]; j ++) { if (a[i][j] == 0) { akt += ile[i][j]; } } if (i != 1) { for (int j = 1; j <= n[i - 1]; j ++) { kon[j] = 1; } for (int j = 1; j <= n[i]; j ++) { kon[a[i][j]] = 0; ile[i - 1][a[i][j]] += ile[i][j]; } } } cout << wyn << "\n"; return 0; } |
English