232172026-01-16 17:39:38xxxHírlánccpp17Accepted 80/80324ms44716 KiB
#include <bits/stdc++.h>
using namespace std;


#define int long long

int n;
const int mxN = 10000;
vector<vector<int>> adj, adj2, adj3;
vector<bool> vis;
vector<int> topOrd, num, num2, maxs;
int cnt = 1;

void dfs(int v) {
    vis[v] = 1;
    for(int u : adj[v]) {
        if(!vis[u]) {
            dfs(u);
        }
    }
    topOrd.push_back(v);
}

void dfs2(int v) {
    vis[v] = 1;
    num[v] = cnt;
    num2[cnt]++;

    for(int u : adj2[v]) {
        if(!vis[u]) {
            dfs2(u);
        }
    }
}

void dfs3(int v) {
    vis[v] = 1;
    int sum = 0;
    for(int u : adj3[v]) {
        if(!vis[u]) {
            dfs3(u);
        }
        sum += maxs[u];
    }
    maxs[v] = sum + num2[v];
}

signed main() {
    cin >> n;
    adj.assign(n+1, {});
    adj2.assign(n+1, {});
    adj3.assign(n+1, {});
    vis.assign(n+1, 0);
    num.assign(n+1, -1);
    num2.assign(n+1, 0);
    for(int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        adj2[x].push_back(i);
        adj[i].push_back(x);
        //cout << i << ' ' << x << endl;
    }


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

    reverse(topOrd.begin(), topOrd.end());
    vis.assign(n+1, 0);

    for(int x : topOrd) {
        //cout << x << ' ';
        if(!vis[x]) {
            dfs2(x);
            cnt++;
        }
    }
    //cout << endl;
    cnt--;

    //for(int i = 1; i <= n; i++) cout <<num[i] << " " << i << endl;
    //cout << endl;
    //cout << endl;




    for(int i = 1; i <= n; i++) {
        if (num[adj[i][0]] != num[i]) {
            adj3[num[i]].push_back(num[adj[i][0]]);
            //cout << num[i] << " --> " << num[adj[i][0]] << "         " << i << " --> " << adj[i][0] << endl;
        }
    }


    vis.assign(cnt+1, 0);
    maxs.assign(cnt+1, 0);

    for(int i = 1; i <= cnt; i++) {
        if(!vis[i]) {
            dfs3(i);
        }
    }

    int maxx = 0;
    int maxind;

    for(int i = 1; i <= cnt; i++) {
        if (maxx < maxs[i]) {
            maxx = maxs[i];
            maxind = i;
        }
    }

    for(int i = 1; i <= n; i++) {
        if (num[i] == maxind) {
            cout << i << ' ' << maxx << endl;
            return 0;
        }
    }
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted1ms316 KiB
subtask220/20
2Accepted3ms564 KiB
3Accepted2ms752 KiB
4Accepted3ms564 KiB
5Accepted3ms564 KiB
6Accepted2ms564 KiB
7Accepted2ms564 KiB
8Accepted2ms568 KiB
9Accepted2ms564 KiB
10Accepted2ms564 KiB
11Accepted2ms632 KiB
12Accepted2ms564 KiB
subtask318/18
13Accepted236ms32172 KiB
14Accepted317ms32296 KiB
15Accepted239ms32684 KiB
16Accepted317ms33144 KiB
17Accepted324ms36008 KiB
18Accepted243ms36520 KiB
19Accepted250ms36524 KiB
20Accepted323ms36516 KiB
21Accepted245ms42464 KiB
22Accepted248ms44716 KiB
subtask442/42
23Accepted1ms500 KiB
24Accepted3ms564 KiB
25Accepted2ms752 KiB
26Accepted3ms564 KiB
27Accepted3ms564 KiB
28Accepted2ms564 KiB
29Accepted2ms564 KiB
30Accepted2ms568 KiB
31Accepted2ms564 KiB
32Accepted2ms564 KiB
33Accepted2ms632 KiB
34Accepted2ms564 KiB
35Accepted236ms32172 KiB
36Accepted317ms32296 KiB
37Accepted239ms32684 KiB
38Accepted317ms33144 KiB
39Accepted324ms36008 KiB
40Accepted243ms36520 KiB
41Accepted250ms36524 KiB
42Accepted323ms36516 KiB
43Accepted245ms42464 KiB
44Accepted248ms44716 KiB
45Accepted291ms34212 KiB
46Accepted238ms34888 KiB
47Accepted244ms34920 KiB
48Accepted305ms35240 KiB
49Accepted300ms35752 KiB
50Accepted237ms36636 KiB
51Accepted321ms37036 KiB
52Accepted246ms37200 KiB
53Accepted289ms37800 KiB
54Accepted225ms39080 KiB