#include <bits/stdc++.h>
#define int long long
const int MAX = 1e6 + 5;
int last[MAX];
std::vector<int> P[MAX];
int gle[MAX];
int dp[MAX];
int memo[MAX];
bool O[MAX];
void dfs(int u)
{
O[u] = true;
int sons = 0;
for (auto it : P[u])
{
if (O[it])
continue;
// gle[it] = gle[u] + 1;
dfs(it);
dp[u] += dp[it];
sons++;
}
if (sons == 0)
dp[u] = 1;
// std::cout << "TERAZ " << u << " " << gle[u] << " " << dp[u] << "\n";
memo[gle[u]] += dp[u];
}
void solve()
{
int k, n;
std::cin >> k >> n;
int cnt = n;
int ans = 0;
for (int i = 1; i <= n; i++)
{
last[i] = i;
gle[i] = 1;
}
for (int day = 2; day <= k; day++)
{
std::cin >> n;
// std::cout << "DAY " << day << " " << n << "\n";
std::vector<int> cur_nums;
for (int i = 1; i <= n; i++)
{
int x;
std::cin >> x;
cnt++;
gle[cnt] = day;
if (x != 0)
{
P[last[x]].push_back(cnt);
}
cur_nums.push_back(cnt);
}
for (int i = 1; i <= n; i++)
{
last[i] = cur_nums[i - 1];
}
}
for (int i = 1; i <= cnt; i++)
{
if (!O[i])
dfs(i);
}
for (int i = 1; i <= cnt; i++)
assert(gle[i] <= k && gle[i] >= 1);
for (int i = 1; i <= k; i++)
{
ans = std::max(ans, memo[i]);
}
std::cout << ans;
}
int32_t main()
{
std::ios_base::sync_with_stdio(0);
std::cin.tie(0);
std::cout.tie(0);
int testcases = 1;
// std::cin >> testcases;
while (testcases--)
{
solve();
}
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 89 90 91 92 93 94 95 96 97 | #include <bits/stdc++.h> #define int long long const int MAX = 1e6 + 5; int last[MAX]; std::vector<int> P[MAX]; int gle[MAX]; int dp[MAX]; int memo[MAX]; bool O[MAX]; void dfs(int u) { O[u] = true; int sons = 0; for (auto it : P[u]) { if (O[it]) continue; // gle[it] = gle[u] + 1; dfs(it); dp[u] += dp[it]; sons++; } if (sons == 0) dp[u] = 1; // std::cout << "TERAZ " << u << " " << gle[u] << " " << dp[u] << "\n"; memo[gle[u]] += dp[u]; } void solve() { int k, n; std::cin >> k >> n; int cnt = n; int ans = 0; for (int i = 1; i <= n; i++) { last[i] = i; gle[i] = 1; } for (int day = 2; day <= k; day++) { std::cin >> n; // std::cout << "DAY " << day << " " << n << "\n"; std::vector<int> cur_nums; for (int i = 1; i <= n; i++) { int x; std::cin >> x; cnt++; gle[cnt] = day; if (x != 0) { P[last[x]].push_back(cnt); } cur_nums.push_back(cnt); } for (int i = 1; i <= n; i++) { last[i] = cur_nums[i - 1]; } } for (int i = 1; i <= cnt; i++) { if (!O[i]) dfs(i); } for (int i = 1; i <= cnt; i++) assert(gle[i] <= k && gle[i] >= 1); for (int i = 1; i <= k; i++) { ans = std::max(ans, memo[i]); } std::cout << ans; } int32_t main() { std::ios_base::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int testcases = 1; // std::cin >> testcases; while (testcases--) { solve(); } return 0; } |
English