結果
| 問題 |
No.901 K-ary εxtrεεmε
|
| コンテスト | |
| ユーザー |
eve__fuyuki
|
| 提出日時 | 2024-06-18 14:34:59 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,247 bytes |
| コンパイル時間 | 2,666 ms |
| コンパイル使用メモリ | 212,644 KB |
| 最終ジャッジ日時 | 2025-02-21 23:15:16 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 9 WA * 20 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
void fast_io() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
}
int main() {
fast_io();
int n;
cin >> n;
vector<vector<pair<int, int>>> g(n);
for (int i = 0; i < n - 1; i++) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
vector<int> pre(n, -1);
vector<long long> dist(n, -1);
vector<int> dep(n, -1);
deque<int> dq{0};
pre[0] = dist[0] = dep[0] = 0;
while (!dq.empty()) {
int u = dq.front();
dq.pop_front();
for (auto [v, w] : g[u]) {
if (pre[v] == -1) {
pre[v] = u;
dist[v] = dist[u] + w;
dep[v] = dep[u] + 1;
dq.push_back(v);
}
}
}
vector<vector<int>> dbl_pre(20, vector<int>(n));
dbl_pre[0] = pre;
for (int i = 0; i < 19; i++) {
for (int j = 0; j < n; j++) {
dbl_pre[i + 1][j] = dbl_pre[i][dbl_pre[i][j]];
}
}
auto lca = [&](int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
int diff = dep[u] - dep[v];
for (int i = 0; i < 20; i++) {
if (diff & (1 << i)) {
u = dbl_pre[i][u];
}
}
if (u == v) return u;
for (int i = 19; i >= 0; i--) {
if (dbl_pre[i][u] != dbl_pre[i][v]) {
u = dbl_pre[i][u];
v = dbl_pre[i][v];
}
}
return pre[u];
};
auto calc_dist = [&](int u, int v) {
return dist[u] + dist[v] - 2 * dist[lca(u, v)];
};
int q;
cin >> q;
for (; q--;) {
int k;
cin >> k;
priority_queue<pair<int, int>> pq;
vector<int> x(k);
for (int i = 0; i < k; i++) {
cin >> x[i];
pq.push({dep[x[i]], x[i]});
}
long long ans = 0;
while (pq.size() > 1) {
auto [d1, u] = pq.top();
pq.pop();
auto [d2, v] = pq.top();
pq.pop();
ans += calc_dist(u, v);
auto l = lca(u, v);
pq.push({dep[l], lca(u, v)});
}
cout << ans << "\n";
}
}
eve__fuyuki