friendbooloperator ==(Vector a, Vector b) { return a.x == b.x && a.y == b.y; } friendbooloperator !=(Vector a, Vector b) { return a.x != b.x || a.y != b.y; } friend Vector operator -(Vector a) { return {-a.x, -a.y}; } friend Vector operator +(Vector a, Vector b) { return {a.x + b.x, a.y + b.y}; } friend Vector operator -(Vector a, Vector b) { return {a.x - b.x, a.y - b.y}; } friend T operator *(Vector a, Vector b) { return a.x * b.y - a.y * b.x; } template<class_T> friend Vector operator *(Vector a, _T b) { return {a.x * b, a.y * b}; } template<class_T> friend Vector operator *(_T a, Vector b) { return {a * b.x, a * b.y}; } template<class_T> friend Vector operator /(Vector a, _T b) { return {a.x * 1.0 / b, a.y * 1.0 / b}; } friend Vector operator +=(Vector &a, Vector b) { return a = {a.x + b.x, a.y + b.y}; } friend Vector operator -=(Vector &a, Vector b) { return a = {a.x - b.x, a.y - b.y}; } template<class_T> friend Vector operator *=(Vector &a, _T b) { return a = {a.x * b, a.y * b}; } template<class_T> friend Vector operator /=(Vector &a, _T b) { return a = {a.x * 1.0 / b, a.y * 1.0 / b}; } friendbooloperator <(Vector a, Vector b) { return a * b > 0; } };
using i64 = int64_t; using Vec = Vector<i64>;
constint kMaxN = 5e5 + 5;
int n, q, cnt, k, m; int u[kMaxN], v[kMaxN], w[kMaxN], fa[kMaxN], id[kMaxN], s[kMaxN]; int ls[kMaxN], rs[kMaxN], f[kMaxN], g[kMaxN]; std::priority_queue<Vec> qq[kMaxN];
inlinevoidchkmax(int &x, int y){ x = (x > y ? x : y); } inlinevoidchkmin(int &x, int y){ x = (x < y ? x : y); }
intfind(int x){ return x == fa[x] ? x : fa[x] = find(fa[x]); }
voidunionn(int x, int y, int w){ int fx = find(x), fy = find(y); if (fx != fy) { ++cnt, ls[cnt] = id[fx], rs[cnt] = id[fy], s[cnt] = s[id[fx]] + s[id[fy]] - 2 * w; fa[fx] = fy, id[fy] = cnt; } }
voidbuild(){ cnt = n; for (int i = 1; i <= n; ++i) fa[i] = id[i] = i; std::vector<std::tuple<int, int, int>> ed; for (int i = 1; i < n; ++i) ed.emplace_back(w[i], u[i], v[i]); std::sort(ed.begin(), ed.end(), std::greater<>()); for (auto [w, u, v] : ed) { unionn(u, v, w); } }
voiddfs(int u){ for (; qq[u].size(); qq[u].pop()) {} if (u <= n) { qq[u].emplace(1, -s[u]); } else { dfs(ls[u]), dfs(rs[u]); if (qq[ls[u]].size() < qq[rs[u]].size()) qq[ls[u]].swap(qq[rs[u]]); qq[u].swap(qq[ls[u]]); for (; qq[rs[u]].size(); qq[rs[u]].pop()) qq[u].emplace(qq[rs[u]].top()); Vec p = {1, -s[u]}; if (qq[u].top() < p) { for (; qq[u].size() >= 2;) { auto p1 = qq[u].top(); qq[u].pop(); auto p2 = qq[u].top(); if ((p1 - p) * p2 >= 0) qq[u].pop(), qq[u].emplace(p1 + p2); else { qq[u].emplace(p1); break;} } if (qq[u].size()) { auto pp = qq[u].top(); qq[u].pop(); if ((pp - p).x > 0) qq[u].emplace(pp - p); } qq[u].emplace(p); } } }
intsolve(int k){ int L = 0, R = m + 1, res = 0; while (L + 1 < R) { int mid = (L + R) >> 1; if (k * f[mid] + g[mid] > k * f[mid - 1] + g[mid - 1]) L = res = mid; else R = mid; } return k * f[res] + g[res]; }
voiddickdreamer(){ std::cin >> n; std::fill_n(s + 1, n, 0); for (int i = 1; i < n; ++i) std::cin >> u[i] >> v[i] >> w[i], s[u[i]] += w[i], s[v[i]] += w[i]; build(); dfs(cnt); for (m = 0; qq[cnt].size();) { ++m; auto [x, y] = qq[cnt].top(); qq[cnt].pop(); f[m] = f[m - 1] + x, g[m] = g[m - 1] + y; } std::cin >> q; for (int i = 1; i <= q; ++i) { int k; std::cin >> k; std::cout << solve(k) << '\n'; } }