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 std::vector;
using std::array;
using std::pair;
using std::tuple;
template <class F> struct RecLambda : private F {
explicit RecLambda(F&& f) : F(std::forward<F>(f)) {}
template <class... Args> decltype(auto) operator()(Args&&... args) const {
return F::operator()(*this, std::forward<Args>(args)...);
}
};
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int N;
std::cin >> N;
vector<int> to(2 * N - 2), once(2 * N - 2), mult(2 * N - 2);
vector<vector<int>> graph(N);
for (int i = 0; i < N - 1; ++i) {
int a, b, c, d;
std::cin >> a >> b >> c >> d;
a -= 1, b -= 1;
to[2 * i] = b;
to[2 * i + 1] = a;
once[2 * i] = once[2 * i + 1] = c;
mult[2 * i] = mult[2 * i + 1] = d;
graph[a].push_back(2 * i);
graph[b].push_back(2 * i + 1);
}
vector<int> depth(N);
array<vector<int>, 20> parent;
parent[0] = vector(N, 0);
RecLambda([&](auto&& dfs, const int u, const int p) -> void {
parent[0][u] = p;
for (const int e : graph[u]) {
if (to[e] != p) {
depth[to[e]] = depth[u] + 1;
dfs(to[e], u);
}
}
})(0, 0);
for (int k = 0; k < 19; ++k) {
parent[k + 1] = vector(N, 0);
for (int i = 0; i < N; ++i) {
parent[k + 1][i] = parent[k][parent[k][i]];
}
}
const auto lca = [&](int u, int v) {
if (depth[u] < depth[v]) {
std::swap(u, v);
}
for (int dif = depth[u] - depth[v], k = 0; k < 20; ++k) {
if (dif >> k & 1) {
u = parent[k][u];
}
}
if (u == v) {
return u;
}
for (int k = 19; k >= 0; --k) {
if (parent[k][u] != parent[k][v]) {
u = parent[k][u];
v = parent[k][v];
}
}
return parent[0][u];
};
vector<int> coeff(N);
for (int i = 1; i < N; ++i) {
const int j = lca(i - 1, i);
coeff[i - 1] += 1;
coeff[i] += 1;
coeff[j] -= 2;
}
long long ans = 0;
RecLambda([&](auto&& dfs, const int u, const int p) -> void {
for (const int e : graph[u]) {
if (to[e] != p) {
dfs(to[e], u);
coeff[u] += coeff[to[e]];
ans += std::min((long long)coeff[to[e]] * once[e], (long long)mult[e]);
}
}
})(0, 0);
std::cout << ans << '\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... |