Submission #1244368

#TimeUsernameProblemLanguageResultExecution timeMemory
1244368enjeeeffRace (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;
    bool operator<(Edge b) const {return to < b.to;}
};

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

void find_sizes(ll v, ll p = -1) {
    s[v] = 1;
    for (auto &e : adj[v])
        if (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 (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 (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 (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]);

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

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

    for (auto &e : adj[cent]) {
        adj[e.to].erase({cent, e.w});
        divide(e.to);
    }
    adj[cent].clear();
}

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].insert({b, w});
        adj[b].insert({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);
    ans = 1e9;
    for (i = 0; i < N - 1; i++) {
        adj[H[i][0]].insert({H[i][1], L[i]});
        adj[H[i][1]].insert({H[i][0], L[i]});
    }
    divide();
    return (ans == 1e9 ? -1 : ans);
}

Compilation message (stderr)

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