记录编号 615943 评测结果 AAAAAAA
题目名称 [ICPC2026河南省赛]收益 最终得分 100
用户昵称 Gravatarhsl_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;
}