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
60
use std::{
    collections::HashMap,
    io::{self, Read},
};

fn main() {
    let mut input = String::new();
    io::stdin()
        .read_to_string(&mut input)
        .expect("Failed to read input");
    let mut scan = input.split_whitespace();
    let mut next_num = || scan.next().unwrap().parse::<usize>().unwrap();

    let days = next_num();
    let first_day_meetings_count = next_num();
    let mut timeline: Vec<Vec<usize>> = Vec::with_capacity(days);
    // create first day meetings:
    timeline.push(vec![0; first_day_meetings_count]);

    for _ in 1..days {
        let cnt = next_num();
        let mut meetings: Vec<usize> = Vec::with_capacity(cnt);
        for _ in 0..cnt {
            meetings.push(next_num());
        }
        timeline.push(meetings);
    }

    let mut current_members_by_meeting: HashMap<usize, usize> = HashMap::new();
    let mut next_members_by_meeting: HashMap<usize, usize> = HashMap::new();
    let mut max_day_members = 0;

    for meetings in timeline.into_iter().rev() {
        next_members_by_meeting.clear();
        let mut day_members = 0;

        for (i, &meeting_ref) in meetings.iter().enumerate() {
            let meeting_num = i + 1;
            let meeting_members = current_members_by_meeting
                .get(&meeting_num)
                .copied()
                .unwrap_or(1);
            day_members += meeting_members;

            if meeting_ref > 0 {
                next_members_by_meeting
                    .entry(meeting_ref)
                    .and_modify(|v| *v += meeting_members)
                    .or_insert(meeting_members);
            }
        }
        std::mem::swap(
            &mut current_members_by_meeting,
            &mut next_members_by_meeting,
        );
        max_day_members = max_day_members.max(day_members);
    }

    println!("{}", max_day_members);
}