232172026-01-16 17:39:38xxxHírlánccpp17Elfogadva 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;
        }
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
subtask220/20
2Elfogadva3ms564 KiB
3Elfogadva2ms752 KiB
4Elfogadva3ms564 KiB
5Elfogadva3ms564 KiB
6Elfogadva2ms564 KiB
7Elfogadva2ms564 KiB
8Elfogadva2ms568 KiB
9Elfogadva2ms564 KiB
10Elfogadva2ms564 KiB
11Elfogadva2ms632 KiB
12Elfogadva2ms564 KiB
subtask318/18
13Elfogadva236ms32172 KiB
14Elfogadva317ms32296 KiB
15Elfogadva239ms32684 KiB
16Elfogadva317ms33144 KiB
17Elfogadva324ms36008 KiB
18Elfogadva243ms36520 KiB
19Elfogadva250ms36524 KiB
20Elfogadva323ms36516 KiB
21Elfogadva245ms42464 KiB
22Elfogadva248ms44716 KiB
subtask442/42
23Elfogadva1ms500 KiB
24Elfogadva3ms564 KiB
25Elfogadva2ms752 KiB
26Elfogadva3ms564 KiB
27Elfogadva3ms564 KiB
28Elfogadva2ms564 KiB
29Elfogadva2ms564 KiB
30Elfogadva2ms568 KiB
31Elfogadva2ms564 KiB
32Elfogadva2ms564 KiB
33Elfogadva2ms632 KiB
34Elfogadva2ms564 KiB
35Elfogadva236ms32172 KiB
36Elfogadva317ms32296 KiB
37Elfogadva239ms32684 KiB
38Elfogadva317ms33144 KiB
39Elfogadva324ms36008 KiB
40Elfogadva243ms36520 KiB
41Elfogadva250ms36524 KiB
42Elfogadva323ms36516 KiB
43Elfogadva245ms42464 KiB
44Elfogadva248ms44716 KiB
45Elfogadva291ms34212 KiB
46Elfogadva238ms34888 KiB
47Elfogadva244ms34920 KiB
48Elfogadva305ms35240 KiB
49Elfogadva300ms35752 KiB
50Elfogadva237ms36636 KiB
51Elfogadva321ms37036 KiB
52Elfogadva246ms37200 KiB
53Elfogadva289ms37800 KiB
54Elfogadva225ms39080 KiB