#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<vector<int>> v;
vector<int> koniec;
vector<int> dp;
signed main(){
cin.tie(0) -> sync_with_stdio(0);
int k,n;
cin>>k>>n;
vector<vector<int>> v2(k);
vector<int> gdzie(k+1, 0);
gdzie[1] = n;
for(int i=1;i<k;i++){
int m;
cin>>m;
v2[i].resize(m);
for(auto &x : v2[i]){
cin>>x;
}
gdzie[i+1] = gdzie[i]+m;
}
v.resize(gdzie.back()+1);
vector<int> ile(gdzie.back()+1, 0);
for(int i=1;i<k;i++){
int j = 1;
for(int x : v2[i]){
if(x){
v[gdzie[i-1]+x].push_back(gdzie[i]+j);
ile[gdzie[i]+j] ++;
}
j ++;
}
}
vector<pair<int, int>> co;
for(int i=1;i<=gdzie.back();i++){
if(!ile[i]){
auto it = lower_bound(gdzie.begin(), gdzie.end(), i);
int x = (it-gdzie.begin())-1;
co.push_back({i, x});
}
}
koniec.resize(k, 0);
dp.resize(gdzie.back()+1, 0);
vector<int> pocz(k, 0);
for(auto [w, p] : co){
vector<pair<int, int>> kol;
queue<pair<int, int>> q;
q.push({w, p});
while(!q.empty()){
auto [w2, p2] = q.front();
q.pop();
kol.push_back({w2, p2});
for(int sasiad : v[w2]){
q.push({sasiad, p2+1});
}
}
reverse(kol.begin(), kol.end());
for(auto [x, p2] : kol){
for(int sasiad : v[x]){
dp[x] += dp[sasiad];
}
if(v[x].empty()){
dp[x] = 1;
koniec[p2] ++;
}
}
/// cout<<"OK : "<<p<<' '<<dp[w]<<'\n';
pocz[p] += dp[w];
}
int wynik = 0;
int ile2 = 0;
for(int i=0;i<k;i++){
/// cout<<ile2<<' '<<pocz[i]<<' '<<koniec[i]<<'\n';
if(ile2 < pocz[i]){
wynik += (pocz[i]-ile2);
ile2 = 0;
}
else{
ile2 -= pocz[i];
}
ile2 += koniec[i];
}
cout<<wynik;
}
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include<bits/stdc++.h> #define int long long using namespace std; vector<vector<int>> v; vector<int> koniec; vector<int> dp; signed main(){ cin.tie(0) -> sync_with_stdio(0); int k,n; cin>>k>>n; vector<vector<int>> v2(k); vector<int> gdzie(k+1, 0); gdzie[1] = n; for(int i=1;i<k;i++){ int m; cin>>m; v2[i].resize(m); for(auto &x : v2[i]){ cin>>x; } gdzie[i+1] = gdzie[i]+m; } v.resize(gdzie.back()+1); vector<int> ile(gdzie.back()+1, 0); for(int i=1;i<k;i++){ int j = 1; for(int x : v2[i]){ if(x){ v[gdzie[i-1]+x].push_back(gdzie[i]+j); ile[gdzie[i]+j] ++; } j ++; } } vector<pair<int, int>> co; for(int i=1;i<=gdzie.back();i++){ if(!ile[i]){ auto it = lower_bound(gdzie.begin(), gdzie.end(), i); int x = (it-gdzie.begin())-1; co.push_back({i, x}); } } koniec.resize(k, 0); dp.resize(gdzie.back()+1, 0); vector<int> pocz(k, 0); for(auto [w, p] : co){ vector<pair<int, int>> kol; queue<pair<int, int>> q; q.push({w, p}); while(!q.empty()){ auto [w2, p2] = q.front(); q.pop(); kol.push_back({w2, p2}); for(int sasiad : v[w2]){ q.push({sasiad, p2+1}); } } reverse(kol.begin(), kol.end()); for(auto [x, p2] : kol){ for(int sasiad : v[x]){ dp[x] += dp[sasiad]; } if(v[x].empty()){ dp[x] = 1; koniec[p2] ++; } } /// cout<<"OK : "<<p<<' '<<dp[w]<<'\n'; pocz[p] += dp[w]; } int wynik = 0; int ile2 = 0; for(int i=0;i<k;i++){ /// cout<<ile2<<' '<<pocz[i]<<' '<<koniec[i]<<'\n'; if(ile2 < pocz[i]){ wynik += (pocz[i]-ile2); ile2 = 0; } else{ ile2 -= pocz[i]; } ile2 += koniec[i]; } cout<<wynik; } |
English