Submission #583278

#TimeUsernameProblemLanguageResultExecution timeMemory
583278600MihneaChase (CEOI17_chase)C++17
20 / 100
4088 ms141024 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];
ll from_up[N][B];
ll from_down[N][B];
ll sum_vecs[N];
ll sol = -INF;
vector<int> g[N];

void dfs1(int a, int p = 0) {
  ll gain = 0;
  for (auto &b : g[a]) {
    if (b != p) {
      dfs1(b, a);
      gain += pigs[b];
      for (int i = 1; i <= bread_have; i++) {
        from_up[a][i] = max(from_up[a][i], from_up[b][i]);
      }
    }
  }

  for (int i = bread_have - 1; i >= 0; i--) {
    from_up[a][i + 1] = max(from_up[a][i + 1], from_up[a][i] + gain);
  }
}

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) {
      for (int i = 0; i <= bread_have; i++) {
        from_down[a][i] = max(from_down[a][i], from_down[b][i]);
        if (i >= 1) {
          from_down[a][i] = max(from_down[a][i], sum_vecs[a]);
        }
      }
      for (int i = bread_have - 1; i >= 0; i--) {
        from_down[a][i + 1] = max(from_down[a][i + 1], from_down[b][i] + sum_vecs[a] - pigs[b]);
      }
    }
  }

}

void dfs3(int a, int p = 0) {
  for (auto &b : g[a]) {
    if (b != p) {
      dfs3(b, a);
    }
  }
  sol = max(sol, from_down[a][bread_have]);
  sol = max(sol, from_up[a][bread_have]);
  for (auto &b : g[a]) {
    for (auto &c : g[a]) {
      if (b == p || c == p) {
        continue;
      }
      if (b == c) {
        continue;
      }
      /// no take here
      for (int i = 0; i <= bread_have; i++) {
        for (int j = 0; i + j <= bread_have; j++) {
          sol = max(sol, from_down[b][i] + from_up[c][j]);
        }
      }
      /// take here
      for (int i = 0; i <= bread_have; i++) {
        for (int j = 0; i + j + 1 <= bread_have; j++) {
          sol = max(sol, from_down[b][i] + sum_vecs[a] - pigs[b] + from_up[c][j]); /// sau -pigs[c]?

        }
      }
    }
  }
}

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];
  }
  dfs1(1);
  dfs2(1);

  dfs3(1);

  cout << sol << "\n";


  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...