# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1280899 | Jawad_Akbar_JJ | 공장들 (JOI14_factories) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <map>
using namespace std;
#define int long long
const int N = 500005;
vector<pair<int,int>> nei[N];
map<int,int> mp[N];
int Add[N], Ans[N];
void merge(int a, int b, int c){
if (mp[b].size() > mp[a].size()){
Add[b] += c;
c = 0;
swap(Add[a], Add[b]);
swap(mp[a], mp[b]);
}
for (auto [i, j] : mp[b]){
if (mp[a].find(-i) != mp[a].end())
Ans[abs(i)] = min(Ans[abs(i)], mp[a][-i] + j + Add[a] + Add[b] + c);
if (mp[a].find(i) == mp[a].end())
mp[a][i] = j + Add[b] - Add[a] + c;
else
mp[a][i] = min(mp[a][i], j + Add[b] - Add[a] + c);
}
}
void dfs(int u, int p){
for (auto [i, w] : nei[u]){
if (i == p)
continue;
dfs(i, u);
merge(u, i, w);
}
}
signed main(){
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int n, q;
cin>>n>>q;
for (int i=1, a, b, c;i<n;i++){
cin>>a>>b>>c;
nei[a].push_back({b, c});
nei[b].push_back({a, c});
}
for (int i=1, s, t, v;i<=q;i++){
cin>>s>>t;
Ans[i] = 1e17;
for (int j=1;j<=s;j++)
cin>>v, mp[v][-i];
for (int j=1;j<=t;j++){
cin>>v, mp[v][i];
if (mp[v].find(-i) != mp[v].end())
Ans[i] = 0;
}
}
dfs(1, 1);
for (int i=1;i<=q;i++)
cout<<Ans[i]<<'\n';
}