제출 #583295

#제출 시각아이디문제언어결과실행 시간메모리
583295600MihneaChase (CEOI17_chase)C++17
40 / 100
4097 ms263760 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = (int) 1e5 + 7; const int B = 100 + 7; const ll INF = (ll) 1e18 + 7; int n, bread_have, pigs[N]; vector<int> g[N]; ll sum_vecs[N]; ll dp1[N][B]; ll dp2[N][B]; ll dp3[N][B]; ll sol; void dfs1(int a, int p = 0) { for (auto &b : g[a]) { if (b != p) { dfs1(b, a); } } for (int i = 0; i <= bread_have; i++) { if (i >= 1) { dp1[a][i] = max(dp1[a][i], sum_vecs[a]); } } for (auto &b : g[a]) { if (b == p) { continue; } for (int i = 0; i <= bread_have; i++) { dp1[a][i] = max(dp1[a][i], dp1[b][i]); if (i >= 1) { dp1[a][i] = max(dp1[a][i], dp1[b][i - 1] + (sum_vecs[a] - pigs[b])); } } } } void dfs2(int a, int p = 0) { for (auto &b : g[a]) { if (b != p) { dfs2(b, a); } } for (auto &b : g[a]) { if (b == p) { continue; } for (int i = 0; i <= bread_have; i++) { dp2[a][i] = max(dp2[a][i], dp2[b][i]); if (i >= 1) { dp2[a][i] = max(dp2[a][i], dp2[b][i - 1] + (sum_vecs[a] - pigs[p])); } } } for (auto &b : g[a]) { if (b == p) { continue; } for (int i = 0; i <= bread_have; i++) { dp3[a][i] = max(dp3[a][i], dp2[b][i]); if (i >= 1) { dp3[a][i] = max(dp3[a][i], dp2[b][i - 1] + sum_vecs[a]); } } } } /// sol = max(sol, sum_vecs[a]); void dfs3(int a, int p = 0) { for (auto &b : g[a]) { if (b != p) { dfs3(b, a); } } sol = max(sol, sum_vecs[a]); sol = max(sol, dp1[a][bread_have]); sol = max(sol, dp2[a][bread_have]); sol = max(sol, dp3[a][bread_have]); for (auto &b : g[a]) { if (b == p) { continue; } for (auto &c : g[a]) { if (c == p) { continue; } if (b == c) { continue; } /// no a for (int i = 0; i <= bread_have; i++) { sol = max(sol, dp1[b][i] + dp2[c][bread_have - i]); } /// yes a for (int i = 0; i + 1 <= bread_have; i++) { sol = max(sol, dp1[b][i] + dp2[c][bread_have - i - 1] + (sum_vecs[a] - pigs[b])); } } } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ///freopen ("input.txt", "r", stdin); cin >> n >> bread_have; for (int i = 1; i <= n; i++) { cin >> pigs[i]; } for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; g[a].push_back(b); g[b].push_back(a); sum_vecs[a] += pigs[b]; sum_vecs[b] += pigs[a]; } if (bread_have == 0) { cout << "0\n"; return 0; } ll Max = 0; for (int root = 1; root <= n; root++) { root = 1; for (int i = 0; i <= n + 1; i++) { for (int j = 0; j <= bread_have + 1; j++) { dp1[i][j] = 0; dp2[i][j] = 0; dp3[i][j] = 0; } } sol = -INF; dfs1(root); dfs2(root); dfs3(root); cout << sol << "\n"; exit(0); cout << root << " ---> " << sol << "\n"; Max = max(Max, sol); //exit(0); } cout << "\t\t\t\t Max = " << Max << "\n"; assert(Max <= 36); return 0; /*ll sol = -INF; for (int root = 1; root <= n; root++) { dfs_down(root); dfs_up(root); /// sol = max(sol, from_up[root][bread_have]); exit(0); } cout << sol << "\n";*/ }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...