Submission #1273676

#TimeUsernameProblemLanguageResultExecution timeMemory
1273676lucas110550Migrations (IOI25_migrations)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;

/*---------------------------------------------------------------*/
/*  send_message : returns the pre‑computed answer for site i   */
/*---------------------------------------------------------------*/
int N;                                     // number of sites
vector<int> S;                     // array S[0..N-1] (S[0] = 0)

int send_message(int _N, int i, int Pi) {
        (void)_N;                          // not needed, we already have N
        (void)Pi;                          // Pi is ignored – S is already prepared
        return S[i];
}

/*---------------------------------------------------------------*/
/*  longest_path : decodes the unique non‑zero entry of S          */
/*---------------------------------------------------------------*/
pair<int,int> longest_path(const vector<int>& s) {
        for (int i = 0; i < (int)s.size(); ++i) {
                if (s[i] != 0) {
                        return { i, s[i] - 1 };
                }
        }
        // no message – only possible when N == 1
        return {0, 0};
}

/*---------------------------------------------------------------*/
/*  main : reads the whole tree, computes a diameter,
                builds S, prints the required output                                     */
/*---------------------------------------------------------------*/
int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);

        if (!(cin >> N)) return 0;
        vector<int> parent(N, -1);
        vector<vector<int>> adj(N);
        for (int i = 1; i < N; ++i) {
                int p;  cin >> p;
                parent[i] = p;
                adj[i].push_back(p);
                adj[p].push_back(i);
        }

        // special case N == 1
        if (N == 1) {
                cout << "\n0 0\n";
                return 0;
        }

        // ---------- BFS that returns farthest node from start ----------
        auto bfs_farthest = [&](int start, vector<int>& dist) -> int {
                dist.assign(N, -1);
                queue<int> q;
                q.push(start);
                dist[start] = 0;
                int far = start;
                while (!q.empty()) {
                        int u = q.front(); q.pop();
                        far = u;
                        for (int v : adj[u]) if (dist[v] == -1) {
                                dist[v] = dist[u] + 1;
                                q.push(v);
                        }
                }
                return far;
        };

        // first BFS from node 0
        vector<int> dist0;
        int A = bfs_farthest(0, dist0);
        // second BFS from A
        vector<int> distA;
        int B = bfs_farthest(A, distA);

        // endpoints of the diameter
        int U = A, V = B;                          // any order is fine

        // build answer array S (size N, S[0] = 0)
        S.assign(N, 0);
        int idx = min(U, V) + 1;                // 1 … N‑1
        int val = max(U, V) + 1;                // ≤ N ≤ 10 000 ≤ 20 000
        S[idx] = val;

        // ----- output -----   (first line : S[1] … S[N‑1])
        for (int i = 1; i < N; ++i) {
                if (i > 1) cout << ' ';
                cout << S[i];
        }
        cout << '\n';
        // second line : the pair of sites with maximal distance
        cout << U << ' ' << V << '\n';

        return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/cc5YweHE.o: in function `main':
stub.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccKwuKQA.o:migrations.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/cc5YweHE.o: in function `main':
stub.cpp:(.text.startup+0x230): undefined reference to `longest_path(std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status