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

struct Konferencja
{
    int numerPoprzedniej = -1;
    int iloscKoniecznychOsob = 0;
};

struct Dzien
{
    std::vector<Konferencja> konferencje;
};

int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    int iloscDni; 
    int n1;
    std::cin >> iloscDni >> n1;
    std::vector<Dzien> dni(iloscDni);
    dni[0].konferencje.resize(n1);
    for (int i = 1; i < iloscDni; ++i)
    {
        int iloscKonferencji;
        std::cin >> iloscKonferencji;
        dni[i].konferencje.resize(iloscKonferencji);
        for (int j = 0; j < iloscKonferencji; ++j)
        {
            int poprzednia;
            std::cin >> poprzednia;
            dni[i].konferencje[j].numerPoprzedniej = poprzednia - 1;
        }
    }
    int maxOsobPotrzebnych = 0;
    for (int i = iloscDni - 1; i >= 0; --i)
    {
        int iloscPotrzebnych = 0;
        for (int j = 0; j < dni[i].konferencje.size(); ++j)
        {
            iloscPotrzebnych += std::max(1, dni[i].konferencje[j].iloscKoniecznychOsob);
            if (dni[i].konferencje[j].numerPoprzedniej != -1)
                dni[i - 1].konferencje[dni[i].konferencje[j].numerPoprzedniej].iloscKoniecznychOsob += std::max(1, dni[i].konferencje[j].iloscKoniecznychOsob);
        }
        maxOsobPotrzebnych = std::max(iloscPotrzebnych, maxOsobPotrzebnych);
    }
    std::cout << maxOsobPotrzebnych << "\n";

    return 0;
}