Submission #1289193

#TimeUsernameProblemLanguageResultExecution timeMemory
1289193MisterReaperPaths (RMI21_paths)C++20
56 / 100
1097 ms24144 KiB
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG
    #include "debug.h"
#else
    #define debug(...) void(23)
#endif

int N, K;

std::vector<std::vector<int>> adj;
std::vector<std::array<int, 3>> E;

std::vector<i64> dep;

std::vector<std::set<std::pair<i64, int>, std::greater<std::pair<i64, int>>>> comes;
std::vector<i64> ans;
std::vector<int> saver;

int dfs1(int v, int pr) {
    debug(v, pr);
    if (int(adj[v].size()) == 1) {
        comes[v].emplace(0, v);
    }
    for (auto i : adj[v]) {
        int u = E[i][0] ^ E[i][1] ^ v;
        if (u == pr) {
            continue;
        }
        int x = dfs1(u, v);
        saver[u] = x;
        dep[x] += E[i][2];
        comes[v].emplace(dep[x], x);
    }

    return comes[v].begin()->second;
}

i64 calc() {
    auto cd = dep;
    std::sort(cd.begin(), cd.end(), std::greater());
    i64 res = 0;
    for (int i = 0; i < K; ++i) {
        res += cd[i];
    }
    return res;
}

void dfs2(int v, int pr) {
    debug(v, pr, dep);
    for (auto i : adj[v]) {
        int u = E[i][0] ^ E[i][1] ^ v;
        if (u == pr) {
            continue;
        }   
        int vtx = saver[u];
        std::pair<i64, int> mxx = {-1, -1};
        for (auto[d, vv] : comes[v]) {
            if (vv != vtx) {
                mxx = {d, vv};
                break;
            }
        }
        dep[vtx] -= E[i][2];
        dep[mxx.second] += E[i][2];
        ans[u] = calc();
        comes[u].emplace(mxx.first + E[i][2], mxx.second);
        dfs2(u, v);
        dep[mxx.second] -= E[i][2];
        dep[vtx] += E[i][2];
    }
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    std::cin >> N >> K;

    adj.resize(N);
    E.resize(N);
    comes.resize(N);
    ans.resize(N);
    saver.resize(N);
    dep.resize(N);

    for (int i = 1; i < N; ++i) {
        int A, B, C;
        std::cin >> A >> B >> C;
        --A, --B;
        E[i] = {A, B, C};
        adj[A].emplace_back(i);
        adj[B].emplace_back(i);
    }

    dfs1(0, 0);

    ans[0] = calc();

    dfs2(0, 0);

    for (int i = 0; i < N; ++i) {
        std::cout << ans[i] << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...