제출 #595159

#제출 시각아이디문제언어결과실행 시간메모리
595159DAleksa경주 (Race) (IOI11_race)C++17
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#include "race.h"

using namespace std;

#define int long long

struct edge {
    int v;
    int w;
};

const int MAX_N = 2e5 + 10;
const int mxK = 1e6 + 10;
const int inf = 1e9;

vector<edge> g[MAX_N];
int sz[MAX_N];
bool mark[MAX_N];
int cnt[mxK];
int mn[mxK];
int res = INT_MAX;

void get_sz(int u, int par) {
    sz[u] = 1;
    for(edge v : g[u]) {
        if(v.v == par || mark[v.v]) continue;
        get_sz(v.v, u);
        sz[u] += sz[v.v];
    }
}

void Add(int u, int par, int w, int k, int edges_count) {
    if(w > k) return;
    cnt[w]++;
    mn[w] = min(mn[w], edges_count);
    for(edge v : g[u]) {
        if(v.v == par || mark[v.v]) continue;
        Add(v.v, u, w + v.w, k, edges_count + 1);
    }
}

void Remove(int u, int par, int w, int k) {
    if(w > k) return;
    mn[w] = inf;
    cnt[w] = 0;
    for(edge v : g[u]) {
        if(v.v == par || mark[v.v]) continue;
        Remove(v.v, u, w + v.w, k);
    }
}

void dfs(int u, int par, int w, int k, int edges_count) {
    if(w >= k) return;
    for(edge v : g[u]) {
        if(v.v == par || mark[v.v]) continue;
        if(cnt[k - w] > 0) res = min(res, edges_count + mn[k - w]);
        dfs(v.v, u, w + v.w, k, edges_count + 1);
    }
}

int find_centroid(int u, int par, int n) {
    for(edge v : g[u]) {
        if(v.v == par || mark[v.v]) continue;
        if(sz[v.v] > n / 2) return find_centroid(v.v, u, n);
    }
    return u;
}

void solve(int u, int n, int k) {
    get_sz(u, 0);
    int centroid = find_centroid(u, 0, n);
    mark[centroid] = true;
    for(edge v : g[centroid]) {
        dfs(v.v, centroid, v.w, k, 1);
        Add(v.v, centroid, v.w, k, 1);
    }
    if(cnt[k] > 0) res = min(res, mn[k]);
    for(edge v : g[centroid]) Remove(v.v, centroid, v.w, k);
    for(edge v : g[centroid]) {
        if(mark[v.v]) continue;
        solve(v.v, n, k);
    }
}

int best_path(int n, int k, int h[][2], int l[]) {
    for(int i = 0; i < n - 1; i++) {
        g[h[i][0] + 1].push_back({h[i][1] + 1, l[i]});
        g[h[i][1] + 1].push_back({h[i][0] + 1, l[i]});
    }
    for(int i = 0; i < mxK; i++) mn[i] = inf;
    solve(1, n, k);
    int ret = res;
    if(ret == INT_MAX) return -1;
    return ret;
}

#undef int

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/cchyudZq.o: in function `main':
grader.cpp:(.text.startup+0x28): undefined reference to `best_path(int, int, int (*) [2], int*)'
collect2: error: ld returned 1 exit status