Submission #363946

#TimeUsernameProblemLanguageResultExecution timeMemory
363946dolphingarlicChase (CEOI17_chase)C++14
100 / 100
304 ms155584 KiB
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;

int n, k, p[100001];
vector<int> graph[100001];
ll dp1[100001][101], dp2[100001][101], ans = 0;

void dfs(int node = 1, int parent = 0) {
    ll c_sum = 0;
    for (int i : graph[node]) c_sum += p[i];
    dp2[node][1] = c_sum;
    for (int i : graph[node]) if (i != parent) {
        dfs(i, node);
        for (int j = 1; j <= k; j++) ans = max(ans, dp2[node][j] + dp1[i][k - j]);
        for (int j = 1; j <= k; j++) {
            dp1[node][j] = max({dp1[node][j], dp1[i][j], dp1[i][j - 1] + c_sum - p[parent]});
            dp2[node][j] = max({dp2[node][j], dp2[i][j], dp2[i][j - 1] + c_sum - p[i]});
        }
    }
    fill(dp2[node] + 1, dp2[node] + k + 1, 0);
    dp2[node][1] = c_sum;
    reverse(graph[node].begin(), graph[node].end());
    for (int i : graph[node]) if (i != parent) {
        for (int j = 1; j <= k; j++) ans = max(ans, dp2[node][j] + dp1[i][k - j]);
        for (int j = 1; j <= k; j++)
            dp2[node][j] = max({dp2[node][j], dp2[i][j], dp2[i][j - 1] + c_sum - p[i]});
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> k;
    for (int i = 1; i <= n; i++) cin >> p[i];
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        graph[u].push_back(v);
        graph[v].push_back(u);
    }
    dfs();
    cout << ans;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...