This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define Rep(i, n)  for(auto i{1}; i <= n; ++i)
#define For(i, a, b) for(auto i{a}; i <= (b); ++i)
#define Ford(i, a, b) for(auto i{a}; i >= (b); --i)
#define Forv(v, h) for(auto &v : h)
#define Bit(x, i) ((x) >> (i) & 1ll)
#define onbit(x, i) ((x) | (1ll << i))
#define offbit(x, i) ((x) &~ (1ll << i))
#define cnt_bit(x) __builtin_popcountll(x)
#define Log2(x) (63 - __builtin_clzll(x))
#define reset(h, v) (memset(h, v, sizeof(h)))
#define memoryof(v) (sizeof(v) / 1024 / 1024)
#define name "friend"
using ii  = pair<int, int>;
using ull = unsigned long long;
using db  = long double;
using vi  = vector<int>;
using vvi  = vector<vi>;
using vii  = vector<ii>;
const int dx[] = {0, 0, +1, -1};
const int dy[] = {-1, +1, 0, 0};
const int MAXN = 1e6  + 10;
const int  MOD = 1e9  + 7;
const int   oo = 1e18 + 1;
const int base = 311;
int n, f[MAXN];
int depth[MAXN], p[MAXN][20], a[MAXN], b[MAXN], c1[MAXN], c2[MAXN];
vi G[MAXN];
void dfs(int u, int par) {
    p[u][0] = par;
    For (k, 1, 19) p[u][k] = p[p[u][k - 1]][k - 1];
    Forv (v, G[u]) {
        if (v == par) continue;
        depth[v] = depth[u] + 1;
        dfs(v, u);
    }
}
int lca(int u, int v) {
    if (depth[u] < depth[v]) swap(u, v);
    int len = depth[u] - depth[v];
    For (k, 0, 19) if (Bit(len, k)) u = p[u][k];
    if (u == v) return u;
    Ford (k, 19, 0) {
        if (p[u][k] != p[v][k]) {
            u = p[u][k];
            v = p[v][k];
        }
    }
    return p[u][0];
}
void dfs0(int u, int par) {
    Forv(v, G[u]) {
        if (v == par) continue;
        dfs0(v, u);
        f[u] += f[v];
    }
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    //  freopen(name".inp", "r", stdin);
    //  freopen(name".out", "w", stdout);
    ////////////////////////////////
    cin >> n;
    For (i, 1, n - 1) {
        cin >> a[i] >> b[i] >> c1[i] >> c2[i];
        G[a[i]].push_back(b[i]);
        G[b[i]].push_back(a[i]);
    }
    G[0].push_back(1);
    G[1].push_back(0);
    dfs(0, 0);
    For(i, 1, n - 1) {
        int LCA = lca(i, i + 1);
        f[i]++;
        f[i + 1]++;
        f[LCA]-=2;
    }
    int ans = 0;
    dfs0(1, 0);
    For(i, 1, n - 1) {
        if (depth[a[i]] < depth[b[i]]) swap(a[i], b[i]);
        ans += min(f[a[i]] * c1[i], c2[i]);
    }
    cout << ans << '\n';
    cerr << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s.\n";
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |