# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1279003 | IBory | Factories (JOI14_factories) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define pii pair<ll, ll>
typedef long long ll;
using namespace std;
const int MAX = 500005;
vector<pii> G[MAX], TG[MAX];
int P[MAX][19], H[MAX], in[MAX], T[MAX], dn;
ll D[MAX], ans;
void DFS(int cur, int prev) {
H[cur] = H[prev] + 1;
P[cur][0] = prev;
in[cur] = ++dn;
for (auto [next, d] : G[cur]) {
if (next == prev) continue;
D[next] = D[cur] + d;
DFS(next, cur);
}
}
int LCA(int a, int b) {
if (H[a] < H[b]) swap(a, b);
for (int i = 18; i >= 0; --i) if ((H[a] - H[b]) & (1 << i)) a = P[a][i];
if (a == b) return a;
for (int i = 18; i >= 0; --i) if (P[a][i] != P[b][i]) a = P[a][i], b = P[b][i];
return P[a][0];
}
pii DFS2(int cur) {
pii ret = { (ll)1e18, (ll)1e18 };
if (T[cur]) (T[cur] == 1 ? ret.first : ret.second) = 0;
for (auto& [next, d] : TG[cur]) {
auto [nd1, nd2] = DFS2(next);
ret.first = min(ret.first, nd1 + d);
ret.second = min(ret.second, nd2 + d);
}
ans = min(ans, ret.first + ret.second);
return ret;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int N, Q;
cin >> N >> Q;
for (int i = 1; i < N; ++i) {
int u, v, d;
cin >> u >> v >> d;
G[u].emplace_back(v, d);
G[v].emplace_back(u, d);
}
DFS(0, 0);
for (int n = 1; n < 19; ++n) for (int i = 0; i < N; ++i) P[i][n] = P[P[i][n - 1]][n - 1];
while (Q--) {
int AN, BN;
cin >> AN >> BN;
vector<int> A;
for (int i = 0; i < AN; ++i) {
int n;
cin >> n;
A.push_back(n);
T[n] = 1;
}
for (int i = 0; i < BN; ++i) {
int n;
cin >> n;
A.push_back(n);
T[n] = 2;
}
sort(A.begin(), A.end(), [&](int a, int b) { return in[a] < in[b]; });
for (int i = 0; i < AN + BN - 1; ++i) A.push_back(LCA(A[i], A[i + 1]));
sort(A.begin(), A.end(), [&](int a, int b) { return in[a] < in[b]; });
A.erase(unique(A.begin(), A.end()), A.end());
for (int i = 1; i < A.size(); ++i) {
int pv = LCA(A[i], A[i - 1]);
TG[pv].emplace_back(A[i], D[A[i]] - D[pv]);
}
ans = 1e18;
DFS2(A[0]);
cout << ans << '\n';
for (int n : A) {
T[n] = 0;
TG[n].clear();
}
}
return 0;
}