Submission #1296339

#TimeUsernameProblemLanguageResultExecution timeMemory
1296339eri16Stations (IOI20_stations)C++20
Compilation error
0 ms0 KiB
#include "stations.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> lbl;

// dfs with parent avoids revisiting and is safe for undirected tree
void dfs(int node, int parent, const vector<vector<int>>& adj, int &depth) {
    int in = depth++;
    for (int nb : adj[node]) {
        if (nb == parent) continue;
        dfs(nb, node, adj, depth);
    }
    int out = depth++;
    lbl[node] = in * 1000 + out; // ok for depth < 1000 as in problem statement
}

vector<int> label(int n, int k, vector<int> u, vector<int> v) {
    // detect whether input appears 1-indexed (common). If so, convert to 0-based.
    bool one_indexed = false;
    for (int x : u) if (x == n) one_indexed = true;
    for (int x : v) if (x == n) one_indexed = true;
    if (one_indexed) {
        for (int &x : u) --x;
        for (int &x : v) --x;
    }

    lbl.assign(n, 0);
    vector<vector<int>> adj(n);            // use n, not n+1
    for (int i = 0; i < n - 1; ++i) {
        adj[u[i]].push_back(v[i]);
        adj[v[i]].push_back(u[i]);
    }

    int depth = 0;
    dfs(0, -1, adj, depth); // root at 0 (after conversion above)
    return lbl;
}

int find_next_station(int s_enc, int t_enc, const vector<int>& cp) {
    if (cp.empty()) return -1;

    int in_s = s_enc / 1000;
    int out_s = s_enc % 1000;
    int in_t = t_enc / 1000;
    int out_t = t_enc % 1000;

    // find deepest cp ancestor of s (max in)
    int parent_idx = -1;
    int best_in = -1;
    for (int i = 0; i < (int)cp.size(); ++i) {
        int k1 = cp[i] / 1000;
        int k2 = cp[i] % 1000;
        if (k1 <= in_s && out_s <= k2) {
            if (k1 > best_in) {
                best_in = k1;
                parent_idx = i;
            }
        }
    }
    if (parent_idx == -1) return -1; // no cp ancestor found -> cannot answer

    // find deepest cp ancestor of t that is deeper than parent (closer to t)
    int candidate = -1;
    int cand_in = -1;
    for (int i = 0; i < (int)cp.size(); ++i) {
        if (i == parent_idx) continue;           // skip parent
        int k1 = cp[i] / 1000;
        int k2 = cp[i] % 1000;
        if (k1 <= in_t && out_t <= k2) {         // cp[i] ancestor of t
            if (k1 > best_in && k1 > cand_in) {  // strictly deeper than parent
                cand_in = k1;
                candidate = i;
            }
        }
    }

    if (candidate != -1) return cp[candidate];
    return cp[parent_idx];
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccO3Q0Mf.o: in function `main':
stub.cpp:(.text.startup+0x4ce): undefined reference to `find_next_station(int, int, std::vector<int, std::allocator<int> >)'
collect2: error: ld returned 1 exit status