#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int k, n1;
cin >> k >> n1;
vector<vector<int>>dp(k);
vector<vector<int>>V(k);
vector<vector<int>>ile(k);
vector<vector<vector<int>>>odwr(k);
V[0].resize(n1,-1);
dp[0].resize(n1);
ile[0].resize(n1);
odwr[0].resize(n1);
for(int i = 1; i < k; i++){
int n;
cin >> n;
odwr[i].resize(n);
V[i].resize(n);
ile[i].resize(n);
dp[i].resize(n);
for(int j = 0; j < n; j++){
int a;
cin >> a;
a--;
V[i][j] = a;
if(a >= 0){
ile[i-1][a]++;
odwr[i-1][a].push_back(j);
}
}
}
vector<int>ost;
for(int i = 0; i < k; i++){
for(int j = 0; j < (int)ile[i].size(); j++){
if(ile[i][j] == 0){
dp[i][j] = 1;
// cout << i << " " << j << '\n';
ost.push_back(i);
}
}
}
for(int i = k - 1; i >= 0; i--){
//mam dpeka
// dp[i][j] = ile potrzeba osob dla konferncji w dniu i, j
while(!ost.empty() && ost.back() >= i)ost.pop_back();
for(int j = 0 ;j < (int)V[i].size(); j++){
// if(!ile[i][j])continue;
for(auto x : odwr[i][j]){
dp[i][j] += dp[i+1][x];
}
// if(i == 2 && j == 0){
// cout << dp[i][j] << " xd " << V[i][j] << '\n';
// }
while(!ost.empty() && dp[i][j] > 0 && V[i][j] == -1){
// cout << "usuwamy dzieki " << ost.back() << " w dp[" << i << "][" << j << "]\n";
ost.pop_back();
dp[i][j] --;
}
}
}
int w = 0;
// for(int i = 0; i < k; i++){
// for(int j = 0; j < (int)dp[i].size(); j++){
// cout << "(" << V[i][j] << ", " << dp[i][j] << ") ";
// }
// cout << endl;
// }
for(int i = 0; i < k; i++){
for(int j = 0; j < (int)dp[i].size(); j++){
// cout << dp[i][j] << " ";
if(V[i][j] == -1)w += dp[i][j];
}
// cout << endl;
}
cout << w << '\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 72 73 74 75 76 77 78 79 80 81 82 | #include<bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int k, n1; cin >> k >> n1; vector<vector<int>>dp(k); vector<vector<int>>V(k); vector<vector<int>>ile(k); vector<vector<vector<int>>>odwr(k); V[0].resize(n1,-1); dp[0].resize(n1); ile[0].resize(n1); odwr[0].resize(n1); for(int i = 1; i < k; i++){ int n; cin >> n; odwr[i].resize(n); V[i].resize(n); ile[i].resize(n); dp[i].resize(n); for(int j = 0; j < n; j++){ int a; cin >> a; a--; V[i][j] = a; if(a >= 0){ ile[i-1][a]++; odwr[i-1][a].push_back(j); } } } vector<int>ost; for(int i = 0; i < k; i++){ for(int j = 0; j < (int)ile[i].size(); j++){ if(ile[i][j] == 0){ dp[i][j] = 1; // cout << i << " " << j << '\n'; ost.push_back(i); } } } for(int i = k - 1; i >= 0; i--){ //mam dpeka // dp[i][j] = ile potrzeba osob dla konferncji w dniu i, j while(!ost.empty() && ost.back() >= i)ost.pop_back(); for(int j = 0 ;j < (int)V[i].size(); j++){ // if(!ile[i][j])continue; for(auto x : odwr[i][j]){ dp[i][j] += dp[i+1][x]; } // if(i == 2 && j == 0){ // cout << dp[i][j] << " xd " << V[i][j] << '\n'; // } while(!ost.empty() && dp[i][j] > 0 && V[i][j] == -1){ // cout << "usuwamy dzieki " << ost.back() << " w dp[" << i << "][" << j << "]\n"; ost.pop_back(); dp[i][j] --; } } } int w = 0; // for(int i = 0; i < k; i++){ // for(int j = 0; j < (int)dp[i].size(); j++){ // cout << "(" << V[i][j] << ", " << dp[i][j] << ") "; // } // cout << endl; // } for(int i = 0; i < k; i++){ for(int j = 0; j < (int)dp[i].size(); j++){ // cout << dp[i][j] << " "; if(V[i][j] == -1)w += dp[i][j]; } // cout << endl; } cout << w << '\n'; } |
English