Submission #1244348

#TimeUsernameProblemLanguageResultExecution timeMemory
1244348enjeeeffRace (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include"race.h"
typedef long long ll;
#define vec vector
using namespace std;

struct Edge {
    ll to, w;
};

const ll maxn = 2e5 + 1;
const ll maxk = 1e6 + 1;
ll ans, k, t = 0;
vec<Edge> adj[maxn];
ll deleted[maxn], ofLength[maxk], s[maxn], lastUpdate[maxk];

void find_sizes(ll v, ll p = -1) {
    s[v] = 1;
    for (auto &e : adj[v])
        if (!deleted[e.to] && e.to != p) {
            find_sizes(e.to, v);
            s[v] += s[e.to];
        }
}

ll find_centroid(ll v, ll n, ll p = -1) {
    for (auto &e : adj[v])
        if (!deleted[e.to] && e.to != p && s[e.to] * 2 > n)
            return find_centroid(e.to, n, v);
    return v;
}

void use_dfs(ll v, ll dist, ll dist1 = 1, ll p = -1) {
    for (auto &e : adj[v])
        if (!deleted[e.to] && e.to != p)
            use_dfs(e.to, dist + e.w, dist1 + 1, v);
    if (dist > k) return;
    if (lastUpdate[k - dist] == t)
        ans = min(ans, ofLength[k - dist] + dist1);
    if (dist == k)
        ans = min(ans, dist1);
}

void apply_dfs(ll v, ll dist, ll dist1 = 1, ll p = -1) {
    for (auto &e : adj[v])
        if (!deleted[e.to] && e.to != p)
            apply_dfs(e.to, dist + e.w, dist1 + 1, v);
    if (dist > k) return;
    if (lastUpdate[dist] < t)
        ofLength[dist] = dist1;
    else
        ofLength[dist] = min(ofLength[dist], dist1);
    lastUpdate[dist] = t;
}

void divide(ll v = 0) {
    find_sizes(v);
    ll cent = find_centroid(v, s[v]);
    deleted[cent] = 1;

    t++;
    for (auto &e : adj[cent]) {
        use_dfs(e.to, e.w);
        apply_dfs(e.to, e.w);
    }

    // for (auto &l : usedLengths)
    //     ofLength[l] = 1e9;
    // usedLengths.clear();

    for (auto &e : adj[cent])
        if (!deleted[e.to])
            divide(e.to);
}

int main() {
    ll n;
    cin >> n >> k;
    // adj.assign(n, {});
    // deleted.assign(n, 0);
    // s.resize(n);
    // ofLength.assign(k + 1, 1e9);
    ans = 1e9;
    for (ll i = 0; i < n - 1; i++) {
        ll a, b, w;
        cin >> a >> b >> w;
        adj[a].push_back({b, w});
        adj[b].push_back({a, w});
    }
    divide();
    cout << (ans == 1e9 ? -1 : ans) << '\n';
}

// int best_path(int N, int K, int H[][2], int L[]) {
//     ll i;
//     k = K;
//     // deleted.assign(N, 0);
//     // adj.assign(N, {});
//     // s.resize(N);
//     // ofLength.assign(K + 1, 1e9);
//     fill(begin(ofLength), end(ofLength), 1e9);
//     usedLengths.reserve(1e6);
//     ans = 1e9;
//     for (i = 0; i < N - 1; i++) {
//         adj[H[i][0]].push_back({H[i][1], L[i]});
//         adj[H[i][1]].push_back({H[i][0], L[i]});
//     }
//     divide();
//     return (ans == 1e9 ? -1 : ans);
// }

Compilation message (stderr)

/usr/bin/ld: /tmp/ccfvXGFd.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccE15vAr.o:race.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccfvXGFd.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