Submission #1244255

#TimeUsernameProblemLanguageResultExecution timeMemory
1244255enjeeeff경주 (Race) (IOI11_race)C++20
Compilation error
0 ms0 KiB
#include<iostream>
#include<vector>
#include<map>
#include<set>
typedef long long ll;
#define vec vector
using namespace std;

struct Centroid {
    vec<vec<pair<ll, ll> > > adj;
    vec<ll> s, deleted;
    ll ans = 1e18, k;
    map<ll, multiset<ll> > mp, mp1;

    Centroid(ll n, ll dist) {
        k = dist;
        s.assign(n + 1, 0);
        deleted.assign(n + 1, 0);
        adj.assign(n + 1, {});
        // mp.assign(n + 1, {});
        // mp1.assign(n + 1, {});
    }

    void add(ll a, ll b, ll w) {
        adj[a].emplace_back(b, w);
        adj[b].emplace_back(a, w);
    }

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

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

    void fullfill(ll v, ll par, ll dist, ll dist1 = 1) {
        for (auto &e : adj[v])
            if (!deleted[e.first] && e.first != par)
                fullfill(e.first, v, dist + e.second, dist1 + 1);
        mp[dist].insert(dist1);
    }

    void fullfill1(ll v, ll par, ll dist, ll dist1 = 1) {
        if (dist == k)
            ans = min(dist1, ans);
        for (auto &e : adj[v])
            if (!deleted[e.first] && e.first != par)
                fullfill1(e.first, v, dist + e.second, dist1 + 1);
        mp1[dist].insert(dist1);
        auto &gotSet = mp[dist];
        gotSet.erase(gotSet.find(dist1));
    }

    ll constructAnswer(ll v = 0) {
        count_sizes(v);
        ll cnt = find_centroid(v, s[v]);

        mp.clear();
        deleted[cnt] = 1;
        for (auto &e : adj[cnt]) {
            if (deleted[e.first]) continue;
            fullfill(e.first, cnt, e.second);
        }

        for (auto &e : adj[cnt]) {
            if (deleted[e.first]) continue;
            fullfill1(e.first, cnt, e.second);

            for (auto &ofLength : mp1) {
                auto p = mp.find(k - ofLength.first);
                if (p == mp.end() || !p->second.size()) continue;
                ans = min(*p->second.begin() + *ofLength.second.begin(), ans);
            }

            fullfill(e.first, cnt, e.second);
            mp1.clear();
        }

        for (auto &e : adj[cnt])
            if (!deleted[e.first])
                constructAnswer(e.first);
    }
};

int main() {
    ll n, k;
    cin >> n >> k;
    Centroid structure(n, k);

    while (--n) {
        ll a, b, w;
        cin >> a >> b >> w;
        structure.add(a, b, w);
    }
    structure.constructAnswer();

    cout << structure.ans << '\n';
}

Compilation message (stderr)

race.cpp: In member function 'll Centroid::constructAnswer(ll)':
race.cpp:91:5: warning: no return statement in function returning non-void [-Wreturn-type]
   91 |     }
      |     ^
/usr/bin/ld: /tmp/ccHaJsZV.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccMQXQme.o:race.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccHaJsZV.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