#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i < b; i++)
#define per(i, a, b) for(int i = a; i >= b; i--)
#define all(v) begin(v), end(v)
#define st first
#define nd second
using namespace std;
using ll = long long;
using bigi = __int128;
using pii = pair<int, int>;
const int N = 2e6 + 5;
vector<int> G[N];
int wart[N];
int roz[N];
int dn[N];
void dfs(int v){
roz[v] = G[v].empty();
for(auto i : G[v]){
dfs(i);
roz[v] += roz[i];
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n, k;
cin >> k >> n;
int ilewol = 0;
int odp = 0;
int num = n;
int prz = 0;
rep(i, 1, n + 1){
dn[i] = 1;
}
rep(i, 2, k + 1){
int ni;
cin >> ni;
rep(j, 1, ni + 1){
int ai;
cin >> ai;
dn[num + j] = i;
if(!ai) continue;
G[prz + ai].push_back(num + j);
wart[num + j] = ai;
}
prz = num;
num += ni;
}
int ile = 0;
rep(i, 1, num + 1){
if(dn[i] != dn[i - 1]){
ilewol += ile;
ile = 0;
}
if(!wart[i]){
dfs(i);
if(ilewol > roz[i]){
ilewol -= roz[i];
}
else{
odp += roz[i] - ilewol;
ilewol = 0;
}
}
if(G[i].empty()){
ile++;
}
}
cout << odp << '\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 69 70 71 | #include <bits/stdc++.h> #define rep(i, a, b) for(int i = a; i < b; i++) #define per(i, a, b) for(int i = a; i >= b; i--) #define all(v) begin(v), end(v) #define st first #define nd second using namespace std; using ll = long long; using bigi = __int128; using pii = pair<int, int>; const int N = 2e6 + 5; vector<int> G[N]; int wart[N]; int roz[N]; int dn[N]; void dfs(int v){ roz[v] = G[v].empty(); for(auto i : G[v]){ dfs(i); roz[v] += roz[i]; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, k; cin >> k >> n; int ilewol = 0; int odp = 0; int num = n; int prz = 0; rep(i, 1, n + 1){ dn[i] = 1; } rep(i, 2, k + 1){ int ni; cin >> ni; rep(j, 1, ni + 1){ int ai; cin >> ai; dn[num + j] = i; if(!ai) continue; G[prz + ai].push_back(num + j); wart[num + j] = ai; } prz = num; num += ni; } int ile = 0; rep(i, 1, num + 1){ if(dn[i] != dn[i - 1]){ ilewol += ile; ile = 0; } if(!wart[i]){ dfs(i); if(ilewol > roz[i]){ ilewol -= roz[i]; } else{ odp += roz[i] - ilewol; ilewol = 0; } } if(G[i].empty()){ ile++; } } cout << odp << '\n'; } |
English