Submission #363948

#TimeUsernameProblemLanguageResultExecution timeMemory
363948dolphingarlicChase (CEOI17_chase)C++14
100 / 100
288 ms153476 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 par = 0) { ll sm = 0; for (int i : graph[node]) sm += p[i]; dp2[node][1] = sm; for (int i : graph[node]) if (i != par) { 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] + sm - p[par]}); dp2[node][j] = max({dp2[node][j], dp2[i][j], dp2[i][j - 1] + sm - p[i]}); } } fill(dp2[node] + 1, dp2[node] + k + 1, 0); dp2[node][1] = sm; reverse(graph[node].begin(), graph[node].end()); for (int i : graph[node]) if (i != par) { 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] + sm - 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...