Submission #1211147

#TimeUsernameProblemLanguageResultExecution timeMemory
1211147ofoz경주 (Race) (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pi pair<int, int>
#define vi vector<int>
const int MAXN = 200005;

int n, k;
vector<pi> adj[MAXN];
bool processed[MAXN];
int sb_size[MAXN];
map<int, int> cnt;
int res = INT32_MAX;
int mx_depth = 0;

int get_sb_size(int v, int p) {
    int res = 1;
    for (pi e : adj[v]) {
        int to, w;
        tie(to, w) = e;
        if (to == p || processed[to]) continue;
        res += get_sb_size(to, v);
    }
    sb_size[v] = res;
    return res;
}

int get_centroid(int v, int p, int s) {
    for (pi e : adj[v]) {
        int to, w;
        tie(to, w) = e;
        if (to == p || processed[to]) continue;
        if (sb_size[to] > s / 2) return get_centroid(to, v, s);
    }
    return v;
}

void get_cnt(int v, int p, int depth, int s, bool fill) {
    if (s > k) return;
    // mx_depth = max(mx_depth, depth);
    if (fill) {
        // cerr << 1 << endl;
        if (cnt.count(s)) cnt[s] = min(cnt[s], depth);
        else cnt[s] = depth;
    } else if (cnt.count(k - s)) {
        // cerr << 1;
        res = min(res, cnt[k - s] + depth);
    }
    for (pi e : adj[v]) {
        int to, w;
        tie(to, w) = e;
        if (to == p || processed[to]) continue;
        get_cnt(to, v, depth + 1, s + w, fill);
    }
}

void centroid_decomp(int v, int p) {
    int c = get_centroid(v, p, get_sb_size(v, p));
    processed[c] = true;
    // mx_depth = 0;
    for (pi e : adj[c]) {
        int to, w;
        tie(to, w) = e;
        if (processed[to]) continue;
        get_cnt(to, c, 1, w, false);
        get_cnt(to, c, 1, w, true);
    }

    cnt.clear();
    cnt[0] = 0;
    for (pi e : adj[c]) {
        int to, w;
        tie(to, w) = e;
        if (to == p || processed[to]) continue;
        centroid_decomp(to, c);
    }
}

signed best_path(signed N, signed K, signed h[][2], signed l[]) {
    n = N;
    k = K;
    for (int i = 0; i < n - 1; ++i) {
        int a, b, w;
        a = h[i][0];
        b = h[i][1];
        w = l[i];
        // cerr << a << ' ' << b << ' ' << w << endl;
        adj[a].push_back({b, w});
        adj[b].push_back({a, w});
    }
    cnt[0] = 0;

    centroid_decomp(0, -1);
    if (res == INT32_MAX) res = -1;
    return res;
}

signed main() {
    signed a[][2] = {{0, 1}, {1, 2}, {1, 3}};
    signed b[] = {1, 2, 4};
    cout << best_path(4, 3, a, b);
}

Compilation message (stderr)

/usr/bin/ld: /tmp/cc3z8p3z.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccfriIA6.o:race.cpp:(.text.startup+0x0): first defined here
collect2: error: ld returned 1 exit status