201912026-01-04 14:40:04hunzombiHírlánccpp17Accepted 80/80391ms41628 KiB
#include <bits/stdc++.h>
using namespace std;

int n;
vector<int> topo, group, group_size, memo;
vector<bool> visited;
vector<vector<int>> group_nodes, graph, r_graph, graph2;

void topoSort(int node) {
    visited[node] = true;
    for (int next : graph[node]) {
        if (!visited[next]) {
            topoSort(next);
        }
    }
    topo.push_back(node);
}

void dfs(int node, int group_id, vector<int>& comp) {
    group[node] = group_id;
    comp.push_back(node);
    for (int next : r_graph[node]) {
        if (group[next] == -1) {
            dfs(next, group_id, comp);
        }
    }
}

void dfs2(int node) {
    if (memo[node] != -1) return;
    memo[node] = 0;
    int sum = 0;
    for (int next : graph2[node]) {
        if (memo[next] == -1) {
            dfs2(next);
        }
        sum += memo[next];
    }
    memo[node] = sum + group_size[node];
}

int main()
{
    cin >> n;

    visited.assign(n + 1, false);
    group.assign(n + 1, -1);
    graph.assign(n + 1, vector<int>(0));
    r_graph.assign(n + 1, vector<int>(0));
    group_nodes.push_back(vector<int>(0));

    for (int i=1; i <= n; i++) {
        int u;
        cin >> u;
        graph[i].push_back(u);
        r_graph[u].push_back(i);
    }

    for (int i=1; i <= n; i++) {
        if (!visited[i]) {
            topoSort(i);
        }
    }

    reverse(topo.begin(), topo.end());
    int number_of_groups = 1;

    for (int node : topo) {
        if (group[node] == -1) {
            vector<int> components(0);
            dfs(node, number_of_groups++, components);
            group_nodes.push_back(components);
        }
    }

    group_size.assign(number_of_groups, 0);

    for (int g = 1; g < number_of_groups; g++) {
        group_size[g] = group_nodes[g].size();
    }

    graph2.assign(number_of_groups, vector<int>(0));
    memo.assign(number_of_groups, -1);

    for (int i=1; i <= n; i++) {
        for (int next : graph[i]) {
            if (group[i] != group[next]) {
                graph2[group[i]].push_back(group[next]);
            }
        }
    }

    int max_group = 0;

    for (int g = 1; g < number_of_groups; g++) {
        if (memo[g] == -1) {
            dfs2(g);
        }
        if (memo[g] > memo[max_group]) {
            max_group = g;
        }
    }

    cout << group_nodes[max_group][0] << ' ' << memo[max_group] << '\n';
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
subtask220/20
2Accepted3ms564 KiB
3Accepted3ms764 KiB
4Accepted3ms564 KiB
5Accepted2ms748 KiB
6Accepted3ms564 KiB
7Accepted2ms564 KiB
8Accepted3ms808 KiB
9Accepted3ms820 KiB
10Accepted2ms564 KiB
11Accepted3ms756 KiB
12Accepted3ms564 KiB
subtask318/18
13Accepted335ms25332 KiB
14Accepted300ms24748 KiB
15Accepted261ms24964 KiB
16Accepted264ms25680 KiB
17Accepted261ms29608 KiB
18Accepted351ms29112 KiB
19Accepted356ms29100 KiB
20Accepted275ms29100 KiB
21Accepted268ms35756 KiB
22Accepted250ms37928 KiB
subtask442/42
23Accepted1ms316 KiB
24Accepted3ms564 KiB
25Accepted3ms764 KiB
26Accepted3ms564 KiB
27Accepted2ms748 KiB
28Accepted3ms564 KiB
29Accepted2ms564 KiB
30Accepted3ms808 KiB
31Accepted3ms820 KiB
32Accepted2ms564 KiB
33Accepted3ms756 KiB
34Accepted3ms564 KiB
35Accepted335ms25332 KiB
36Accepted300ms24748 KiB
37Accepted261ms24964 KiB
38Accepted264ms25680 KiB
39Accepted261ms29608 KiB
40Accepted351ms29112 KiB
41Accepted356ms29100 KiB
42Accepted275ms29100 KiB
43Accepted268ms35756 KiB
44Accepted250ms37928 KiB
45Accepted358ms36000 KiB
46Accepted284ms37272 KiB
47Accepted286ms37552 KiB
48Accepted361ms37788 KiB
49Accepted286ms38304 KiB
50Accepted291ms39312 KiB
51Accepted379ms39576 KiB
52Accepted391ms39832 KiB
53Accepted293ms40348 KiB
54Accepted289ms41628 KiB