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
#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int dni, n1;
    cin >> dni >> n1;

    vector<int> ile(dni + 1);
    vector<vector<int>> tatulek(dni + 1);

    ile[1] = n1;

    for (int dzionek = 2; dzionek <= dni; dzionek++) {
        cin >> ile[dzionek];
        tatulek[dzionek].resize(ile[dzionek] + 1);
        for (int j = 1; j <= ile[dzionek]; j++) cin >> tatulek[dzionek][j];
    }

    vector<long long> dp_nastepne(ile[dni] + 1, 1), dp_teraz;
    long long wynikowy_potwor = ile[dni];

    for (int dzionek = dni - 1; dzionek >= 1; dzionek--) {
        vector<long long> dzieciowe_burdy(ile[dzionek] + 1, 0);

        for (int j = 1; j <= ile[dzionek + 1]; j++) {
            int stary = tatulek[dzionek + 1][j];
            if (stary != 0) dzieciowe_burdy[stary] += dp_nastepne[j];
        }

        dp_teraz.assign(ile[dzionek] + 1, 1);
        long long suma_dnia = 0;

        for (int j = 1; j <= ile[dzionek]; j++) {
            dp_teraz[j] = max(1LL, dzieciowe_burdy[j]);
            suma_dnia += dp_teraz[j];
        }

        wynikowy_potwor = max(wynikowy_potwor, suma_dnia);
        dp_nastepne.swap(dp_teraz);
    }

    cout << wynikowy_potwor << '\n';
    return 0;
}