Submission #1014241

#TimeUsernameProblemLanguageResultExecution timeMemory
1014241MilosMilutinovicChase (CEOI17_chase)C++14
100 / 100
481 ms344476 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 100100;
const int K = 105;

long long dp[N][K][2][2];

int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, k;
  cin >> n >> k;
  vector<int> a(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  vector<vector<int>> g(n);
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    --u; --v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  vector<long long> s(n);
  for (int i = 0; i < n; i++) {
    for (int j : g[i]) {
      s[i] += a[j];
    }
  }
  long long res = 0;
  function<void(int, int)> Solve = [&](int v, int pv) {
    dp[v][1][0][1] = s[v];
    dp[v][1][1][1] = s[v];
    for (int i = 1; i <= k; i++) {
      for (int d = 0; d < 2; d++) {
        for (int t = 0; t < 2; t++) {
          dp[v][i][d][t] = max(dp[v][i][d][t], dp[v][i - 1][d][t]);
        }
      }
    }
    for (int u : g[v]) {
      if (u == pv) {
        continue;
      }
      Solve(u, v);
      for (int i = 0; i <= k; i++) {
        for (int me = 0; me < 2; me++) {
          for (int he = 0; he < 2; he++) {
            {
              long long ft = (he == 0 ? 0 : -a[v]);
              res = max(res, dp[v][i][0][me] + dp[u][k - i][1][he] + ft);
            }
            {
              long long ft = (me == 0 ? 0 : -a[u]);
              res = max(res, dp[v][i][1][me] + dp[u][k - i][0][he] + ft);
            }
          }
        }
      }
      for (int i = 0; i <= k; i++) {
        for (int me = 0; me < 2; me++) {
          for (int he = 0; he < 2; he++) {
            long long ft = (me == 0 ? 0 : s[v] - a[u]);
            dp[v][i + me][0][me] = max(dp[v][i + me][0][me], dp[u][i][0][he] + ft);
          }
        }
      }
      for (int i = 0; i <= k; i++) {
        for (int me = 0; me < 2; me++) {
          for (int he = 0; he < 2; he++) {
            long long ft = (me == 0 ? 0 : s[v]);
            if (he == 1) {
              ft -= a[v];
            }
            dp[v][i + me][1][me] = max(dp[v][i + me][1][me], dp[u][i][1][he] + ft);
          }
        }
      }
      for (int i = 1; i <= k; i++) {
        for (int d = 0; d < 2; d++) {
          for (int t = 0; t < 2; t++) {
            dp[v][i][d][t] = max(dp[v][i][d][t], dp[v][i - 1][d][t]);
          }
        }
      }
    }
  };
  Solve(0, 0);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j <= k; j++) {
      for (int d = 0; d < 2; d++) {
        for (int t = 0; t < 2; t++) {
          res = max(res, dp[i][j][d][t]);
        }
      }
    }
  }
  cout << res << '\n';
  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...