Submission #115818

#TimeUsernameProblemLanguageResultExecution timeMemory
115818IOrtroiiiChase (CEOI17_chase)C++14
100 / 100
639 ms168592 KiB
/* 12 2 2 3 3 8 1 5 6 7 8 3 5 4 2 1 2 7 3 4 4 7 7 6 5 6 6 8 6 9 7 10 10 11 10 12 */ #include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 100100; const int K = 110; int n, k; int a[N]; vector<int> g[N]; ll go[N]; ll up[N][K]; ll down[N][K]; ll ans = 0; void dfs(int u, int p) { for (int v : g[u]) if (v != p) { dfs(v, u); } down[u][1] = go[u]; for (int v : g[u]) if (v != p) { for (int i = 1; i <= k; ++i) { up[u][i] = max(up[u][i], max(up[v][i], up[v][i - 1] + go[u] - a[p])); down[u][i] = max(down[u][i], max(down[v][i], down[v][i - 1] + go[u] - a[v])); ans = max(ans, up[v][i - 1] + go[u]); ans = max(ans, down[v][i - 1] + go[u] - a[v]); } } for (int i = 0; i <= k; ++i) { pair<ll, ll> mx = {0, 0}; for (int v : g[u]) if (v != p) { mx.second = max(mx.second, up[v][i]); if (mx.second > mx.first) { swap(mx.first, mx.second); } } for (int v : g[u]) if (v != p) { ll cur; if (up[v][i] == mx.first) { cur = mx.second; } else { cur = mx.first; } ans = max(ans, cur + down[v][k - i]); } } for (int i = 1; i <= k; ++i) { pair<ll, ll> mx = {0, 0}; for (int v : g[u]) if (v != p) { mx.second = max(mx.second, up[v][i - 1]); if (mx.second > mx.first) { swap(mx.first, mx.second); } } for (int v : g[u]) if (v != p) { ll cur; if (up[v][i - 1] == mx.first) { cur = mx.second; } else { cur = mx.first; } ans = max(ans, cur + down[v][k - i] + go[u] - a[v]); } } } int main() { ios_base::sync_with_stdio(false); cin >> n >> k; if (k == 0) { cout << 0 << endl; return 0; } for (int i = 1; i <= n; ++i) { cin >> a[i]; } for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); go[u] += a[v]; go[v] += a[u]; } dfs(1, 0); cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...