/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 332.0 KiB
#2 Accepted 1ms 540.0 KiB
#3 Accepted 1ms 540.0 KiB
#4 Accepted 1ms 772.0 KiB
#5 Accepted 1ms 408.0 KiB
#6 Accepted 1ms 496.0 KiB
#7 Accepted 1ms 540.0 KiB
#8 Accepted 1ms 540.0 KiB
#9 Accepted 1ms 336.0 KiB
#10 Accepted 1ms 540.0 KiB
#11 Accepted 1ms 540.0 KiB
#12 Accepted 73ms 6.352 MiB
#13 Accepted 81ms 6.379 MiB
#14 Accepted 74ms 6.27 MiB
#15 Accepted 74ms 6.27 MiB
#16 Accepted 57ms 6.27 MiB
#17 Accepted 65ms 6.27 MiB
#18 Accepted 63ms 6.27 MiB
#19 Accepted 76ms 6.316 MiB
#20 Accepted 59ms 6.191 MiB
#21 Accepted 81ms 6.312 MiB
#22 Accepted 57ms 6.27 MiB
#23 Accepted 76ms 6.27 MiB
#24 Accepted 62ms 6.184 MiB
#25 Accepted 60ms 6.332 MiB
#26 Accepted 58ms 6.27 MiB
#27 Accepted 64ms 6.27 MiB
#28 Accepted 57ms 6.328 MiB
#29 Accepted 84ms 6.188 MiB
#30 Accepted 68ms 6.184 MiB
#31 Accepted 77ms 6.27 MiB
#32 Accepted 82ms 6.316 MiB
#33 Accepted 76ms 6.273 MiB
#34 Accepted 58ms 6.188 MiB
#35 Accepted 59ms 6.359 MiB
#36 Accepted 58ms 6.324 MiB
#37 Accepted 72ms 6.27 MiB
#38 Accepted 61ms 6.27 MiB
#39 Accepted 67ms 6.316 MiB
#40 Accepted 64ms 6.27 MiB
#41 Accepted 76ms 6.312 MiB
#42 Accepted 44ms 6.07 MiB
#43 Accepted 45ms 6.078 MiB
#44 Accepted 38ms 6.582 MiB
#45 Accepted 42ms 6.68 MiB
#46 Accepted 39ms 6.816 MiB
#47 Accepted 132ms 94.77 MiB
#48 Accepted 109ms 50.582 MiB
#49 Accepted 97ms 50.434 MiB
#50 Accepted 52ms 16.02 MiB

Code

#include <bits/stdc++.h>

using namespace std;

void solve(int cs) {
  int n, k;
  cin >> n >> k;
  vector<int> a(n + 1);
  for (int i = 1; i <= n; i++) cin >> a[i];
  vector<vector<int>> g(n + 1);
  for (int i = 0; i < n - 1; i++) {
    int u, v; cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  const int64_t INF = -1e18;
  int64_t ans = INF;
  auto dfs = [&](auto &&self, int node, int pr) -> vector<int64_t> {
    vector<int64_t> dp(k + 1, INF);
    dp[1] = a[node];
    for (auto &son : g[node]) {
      if (son == pr) continue;
      auto cdp = self(self, son, node);
      for (int i = 1; i < k; i++) {
        if (dp[i] != INF && cdp[k - i] != INF) {
          ans = max(ans, dp[i] + cdp[k - i]);
        }
      }
      for (int i = 1; i < k; i++) {
        if (cdp[i] != INF) {
          dp[i + 1] = max(dp[i + 1], cdp[i] + dp[1]);
        }
      }
    }
    ans = max(ans, dp[k]);
    return dp;
  };
  dfs(dfs, 1, -1);
  cout << (ans == INF ? 0 : ans) << "\n";
}

int32_t main() {
  ios::sync_with_stdio(!cin.tie(0));
  int t = 1;
  // cin >> t;
  for (int i = 1; i <= t; ++i) {
    solve(i);
  }
  return 0;
}

Information

Submit By
Type
Submission
Problem
P1161 Max path sum (Hard Version)
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 18:51:50
Judged At
2025-02-17 18:51:50
Judged By
Score
100
Total Time
132ms
Peak Memory
94.77 MiB