| 记录编号 |
615943 |
评测结果 |
AAAAAAA |
| 题目名称 |
[ICPC2026河南省赛]收益 |
最终得分 |
100 |
| 用户昵称 |
hsl_beat |
是否通过 |
通过 |
| 代码语言 |
C++ |
运行时间 |
2.902 s |
| 提交时间 |
2026-05-27 13:12:07 |
内存使用 |
47.45 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
freopen("shouyi.in", "r", stdin);
freopen("shouyi.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
vector<vector<int>> edges(n + 1);
for (int i = 0; i < n - 1; i++) {
int u, v;
cin >> u >> v;
edges[u].push_back(v);
edges[v].push_back(u);
}
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
vector<int> p(n + 1);
for (int i = 1; i <= m; i++) {
int x;
cin >> x;
p[x]++;
}
// vector<bool> vis(n + 1, 1);
vector<multiset<int>> st(n + 1);
int ans = 0;
function<void(int, int)> dfs = [&](int x, int fa) {
for (auto nex : edges[x]) {
if (nex != fa) {
dfs(nex, x);
if (st[x].size() < st[nex].size()) {
swap(st[x], st[nex]);
}
auto it = st[nex].rbegin();
while (it != st[nex].rend()) {
st[x].insert(*it);
it++;
}
st[nex].clear();
}
}
if (p[x]) {
ans += a[x];
while (p[x]-- && st[x].size()) {
ans += *st[x].rbegin();
st[x].erase(st[x].find(*st[x].rbegin()));
}
} else {
if (st[x].size()) {
int tp = *st[x].rbegin();
st[x].erase(st[x].find(*st[x].rbegin()));
st[x].insert(tp + a[x]);
} else {
st[x].insert(a[x]);
}
}
// cout << x << ": ";
// for (auto it : st[x]) {
// cout << it << ' ';
// }
// cout << '\n';
};
dfs(1, 1);
cout << ans;
return 0;
}