Submission #1359828

#TimeUsernameProblemLanguageResultExecution timeMemory
1359828f0rizenPutovanje (COCI20_putovanje)C++20
110 / 110
65 ms19436 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int inf = 1e9 + 7;
const ll infll = 1e18;

template<typename T>
istream &operator>>(istream &is, vector<T> &a) {
    for (auto &i : a) {
        is >> i;
    }
    return is;
}

struct BinaryJumps {
    static const int lg = 18;

    vector<int> d;
    vector<vector<int>> up;

    BinaryJumps() {}
    BinaryJumps(int n) {
        d.resize(n);
        up.resize(lg, vector<int>(n, -1));
    }

    void add_leaf(int v, int p) {
        d[v] = d[p] + 1;
        up[0][v] = p;
        for (int i = 1; i < lg; ++i) {
            if (up[i - 1][v] != -1) {
                up[i][v] = up[i - 1][up[i - 1][v]];
            }
        }
    }

    int la(int v, int k) {
        for (int i = lg - 1; i >= 0; --i) {
            if (k >= (1 << i)) {
                k -= (1 << i);
                v = up[i][v];
            }
        }
        return v;
    }

    int lca(int u, int v) {
        if (d[u] < d[v]) {
            swap(u, v);
        }
        u = la(u, d[u] - d[v]);
        for (int i = lg - 1; i >= 0; --i) {
            if (up[i][u] != up[i][v]) {
                u = up[i][u];
                v = up[i][v];
            }
        }
        if (u == v) {
            return u;
        }
        return up[0][u];
    }
};

vector<vector<array<int, 3>>> g;
BinaryJumps tr;
vector<int> dp;
ll ans = 0;

void dfs1(int v, int p = -1) {
    for (auto [u, c1, c2] : g[v]) {
        if (u != p) {
            tr.add_leaf(u, v);
            dfs1(u, v);
        }
    }
}

void dfs2(int v, int p = -1) {
    for (auto [u, c1, c2] : g[v]) {
        if (u != p) {
            dfs2(u, v);
            dp[v] += dp[u];
            ans += min(c1 * 1ll * dp[u], ll(c2));
        }
    }
}

int32_t main() {
#ifdef LOCAL
    freopen("/tmp/input.txt", "r", stdin);
#else
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
#endif
    int n;
    cin >> n;
    g.resize(n);
    for (int i = 1; i < n; ++i) {
        int u, v, c1, c2;
        cin >> u >> v >> c1 >> c2;
        --u;
        --v;
        g[u].push_back({v, c1, c2});
        g[v].push_back({u, c1, c2});
    }
    tr = BinaryJumps(n);
    dfs1(0);
    dp.resize(n);
    for (int i = 0; i + 1 < n; ++i) {
        int u = i;
        int v = i + 1;
        int w = tr.lca(u, v);
        dp[u] += 1;
        dp[v] += 1;
        dp[w] -= 2;
    }
    dfs2(0);
    cout << ans << "\n";
    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...