#include <bits/stdc++.h>
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
std::vector<std::vector<std::pair<int, std::pair<long long, long long>>>> adj(
n + 1);
long long tot = 0;
for (int i = 0, a, b, c, d; i < n - 1; ++i) {
std::cin >> a >> b >> c >> d;
adj[a].push_back({b, {c, d}});
adj[b].push_back({a, {d, c}});
tot += c + d;
}
std::vector<long long> path_up(n + 1), path_down(n + 1), ans(n + 1);
std::vector<std::pair<long long, int>> max(n + 1);
std::vector<int> par(n + 1);
long long up = 0;
auto dfs = [&](auto &&self, int u, int p) -> void {
max[u] = {path_down[u], u};
for (auto &[i, pr] : adj[u]) {
if (i == p) {
continue;
}
par[i] = u;
auto [c, d] = pr;
up += d;
path_up[i] = path_up[u] + d;
path_down[i] = path_down[u] + c;
self(self, i, u);
max[u] = std::max(max[u], max[i]);
}
};
dfs(dfs, 1, 0);
std::pair<long long, std::pair<int, int>> s;
auto dfs1 = [&](auto &&self, int u, int p,
long long dep) -> std::pair<long long, int> {
std::pair<long long, int> down = {path_down[u], u};
std::vector<std::pair<long long, int>> v;
for (auto &[i, pr] : adj[u]) {
if (i == p) {
continue;
}
auto [c, d] = pr;
v.push_back(self(self, i, u, dep + c));
down = std::max(down, v.back());
}
long long r = up + dep - path_up[u];
s = std::max(s, {r + (down.first - path_down[u]), {u, down.second}});
std::sort(v.rbegin(), v.rend());
if (v.size() > 1) {
s = std::max(s, {r + v[0].first + v[1].first - 2 * path_down[u],
{v[0].second, v[1].second}});
}
return down;
};
dfs1(dfs1, 1, 0, 0);
// root at one of the start nodes and expand: anyways you will end up with the
// first node being picked as the other start node
for (int i = 1; i <= n; ++i) {
ans[1] = std::max(ans[1], up - path_up[i] + path_down[i]);
}
ans[2] = s.first;
int &node = s.second.first;
up = 0;
path_down.assign(n + 1, 0), path_up.assign(n + 1, 0);
dfs(dfs, node, 0);
int idx = 1;
std::priority_queue<std::pair<long long, int>> pq;
pq.push(max[node]);
std::vector<bool> vis(n + 1);
while (!pq.empty()) {
auto [d, tar] = pq.top();
pq.pop();
if (++idx != 2) {
ans[idx] = ans[idx - 1] + d;
}
while (!vis[tar]) {
vis[tar] = true;
for (auto &[i, pr] : adj[tar]) {
if (!vis[i] and par[tar] != i) {
pq.push({max[i].first - path_down[tar], max[i].second});
}
}
tar = par[tar];
}
}
for (int i = idx; i < ans.size(); ++i) {
ans[i] = tot;
}
int q, x;
std::cin >> q;
while (q--) {
std::cin >> x;
std::cout << tot - ans[x] << '\n';
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |