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
/* 2026
 * Maciej Szeptuch
 */

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <vector>

const int MAX_DAYS = 524288;

unsigned days;
unsigned meetings[MAX_DAYS];
std::vector<unsigned> req[MAX_DAYS];
std::vector<long long unsigned> needs[2];
long long unsigned result;

int main(void)
{
    scanf("%u %u", &days, &meetings[0]);
    result = meetings[0];
    assert(0 < days && days < MAX_DAYS);
    needs[0].resize(meetings[0]);
    for(int d = 1; d < days; ++d)
    {
        scanf("%u", &meetings[d]);
        req[d].resize(meetings[d]);
        for(int m = 0; m < meetings[d]; ++m)
            scanf("%u", &req[d][m]);
    }

    needs[!(days & 1)].resize(meetings[days - 1]);
    for(int d = days - 1; d >= 0; --d)
    {
        long long unsigned day_result = 0;
        if(d > 0)
        {
            needs[!(d & 1)].clear();
            needs[!(d & 1)].resize(meetings[d - 1]);
        }

        for(unsigned m = 0; m < meetings[d]; ++m)
        {
            long long unsigned attendees = std::max(needs[d & 1][m], 1LLU);
            // fprintf(stderr, "[day %d][meeting %u]: needs %llu\n", d, m + 1, attendees);
            day_result += attendees;
            if(d > 0 && req[d][m] > 0)
                needs[!(d & 1)][req[d][m] - 1] += attendees;
        }

        // fprintf(stderr, "[day %d] total: %llu\n", d, day_result);
        if(day_result > result)
            result = day_result;
    }

    printf("%llu\n", result);
    return 0;
}