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
#include <cstdio>
#include <vector>

#ifdef LOCAL
    #define dbg(...) fprintf(stderr, __VA_ARGS__)
#else
    #define dbg(...)
#endif

using namespace std;

vector<vector<int>> prev_meeting; // meeting X on day D requires you to attend meeting prev_meeting[D][X] on day D-1
vector<vector<int>> ppl_req; // meeting X on day D must be attended by at least ppl_req[D][X] people.

int main() {
    int k, n1, ntemp;
    scanf("%d %d", &k, &n1);
    prev_meeting.reserve(k+1);
    ppl_req.reserve(k+1);
    ppl_req.emplace_back(n1, 0);
    prev_meeting.emplace_back(n1, 0);

    for (int i = 1; i < k; ++i) {
        int nx;
        scanf("%d", &nx);
        prev_meeting.emplace_back(nx);
        ppl_req.emplace_back(nx, 0);
        for (int j = 0; j < nx; j++) {
            int mx;
            scanf("%d", &mx);
            prev_meeting[i][j] = mx - 1; // change to 0-indexed
        }
    }

    int maxreq = 0;

    for (int i = k - 1; i >= 0; --i) {
        int totalreq = 0;
        for (unsigned int j = 0; j < prev_meeting[i].size(); ++j) {
            if (ppl_req[i][j] == 0) {
                ppl_req[i][j] = 1;
            }
            totalreq += ppl_req[i][j];

            if (i == 0) continue;
            const int required_meet = prev_meeting[i][j];
            if (required_meet != -1) {
                ppl_req[i-1][required_meet] += ppl_req[i][j];
            }
        }
        if (totalreq > maxreq) {
            maxreq = totalreq;
        }
    }

    printf("%d\n", maxreq);

    return 0;
}