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
// Author : Jakub Rożek
// Task   : KON - Konferencja [B]
// Memory : k + ∑ n_i
// Time   : k + ∑ n_i
// Solv   : wzo - od tylu analizujemy dni

#include <bits/stdc++.h>
using namespace std;

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

    int k;
    cin >> k;

    vector<int> meetings(k + 1);                // ile spotkan w dniu
    vector<vector<long long>> before(k + 1);    // na jakim wykladzie mam byc przed
    vector<vector<long long>> need(k + 1);      // potrzebuje tu x ludzi, by dalej poszli
    long long answer = 0;                       // ilu trzeba ludzi

    cin >> meetings[1];
    before[1].resize(meetings[1] + 1, 0);
    need[1].resize(meetings[1] + 1, 0);
    for (int day = 2; day <= k; ++day) {
        cin >> meetings[day];
        before[day].resize(meetings[day] + 1);
        need[day].resize(meetings[day] + 1, 0);
        for (int i = 1; i <= meetings[day]; ++i) {
            cin >> before[day][i];
        }
    }

    for (int day = k; day >= 1; --day) {
        long long need_people = 0;  // ilu ludzi potrzebuje tego dnia

        for (int i = 1; i <= meetings[day]; ++i) {
            if (need[day][i] == 0) {
                need[day][i] = 1;
            }
            need_people += need[day][i];
            if (before[day][i] != 0) {
                need[day-1][before[day][i]] += need[day][i];
            }
            answer = max(answer, need_people);
        }
    }

    cout << answer << '\n';
}