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
61
62
63
64
65
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

class Konferencja{
    public:
    vector<vector<int>>meetings;
    int days_nmb;
    Konferencja(int days_nmb = 1, int first_day = 0){ init(days_nmb, first_day); }

    void init(int days_nmb_, int first_day_){
        days_nmb = days_nmb_;
        meetings.assign(days_nmb, {});
        meetings[0] = vector<int>(first_day_, 0);
    }
    void set_meetins_day(int d, int n){
        meetings[d].assign(n, 0);
    }
    void add_meeting(int d, int m, int prev){
        meetings[d][m] = prev;
    }
    int solve(){
        int res = (int)meetings.back().size();
        vector<vector<int>>how_many(days_nmb, vector<int>{});
        how_many.back().assign( (int)meetings.back().size(), 1 );
        for (int i = (int)meetings.size()-2; i >= 0; --i){
            how_many[i].assign( (int)meetings[i].size(), 0 );
            for(int j = 0; j < (int)meetings[i+1].size(); j++){
                if( meetings[i+1][j] == -1 ) continue;
                how_many[i][ meetings[i+1][j] ] += how_many[i+1][j];
            }
            int cur_res = 0;
            for(int j = 0; j < (int)how_many[i].size(); j++){
                how_many[i][j] = max(how_many[i][j], 1);
                cur_res += how_many[i][j];
            }
            res = max(res, cur_res);
        }
        return res;
    }
};

void solve(){
    int k, n1, ni, p;
    cin >> k >> n1;
    Konferencja K(k, n1);
    for(int i = 1; i < k; i++){
        cin >> ni;
        K.set_meetins_day(i, ni);
        for(int j = 0; j < ni; j++){
            cin >> p;
            p--;
            K.add_meeting(i, j, p);
        }
    }
    cout << K.solve() << "\n";
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}