/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 3ms 2.77 MiB
#2 Accepted 3ms 2.836 MiB
#3 Accepted 3ms 2.77 MiB
#4 Accepted 3ms 2.652 MiB
#5 Accepted 4ms 2.77 MiB
#6 Accepted 4ms 2.812 MiB
#7 Accepted 4ms 2.77 MiB
#8 Accepted 4ms 2.793 MiB
#9 Accepted 5ms 2.77 MiB
#10 Accepted 10ms 2.77 MiB
#11 Accepted 10ms 2.77 MiB
#12 Accepted 64ms 7.887 MiB
#13 Accepted 40ms 7.641 MiB
#14 Accepted 41ms 7.52 MiB
#15 Accepted 41ms 7.52 MiB
#16 Accepted 75ms 7.887 MiB
#17 Accepted 71ms 8.0 MiB
#18 Accepted 68ms 7.918 MiB
#19 Accepted 45ms 7.52 MiB
#20 Accepted 75ms 7.875 MiB
#21 Accepted 66ms 7.93 MiB
#22 Accepted 75ms 8.023 MiB
#23 Accepted 73ms 8.008 MiB
#24 Accepted 76ms 7.887 MiB
#25 Accepted 41ms 7.52 MiB
#26 Accepted 56ms 7.887 MiB
#27 Accepted 46ms 7.52 MiB
#28 Accepted 60ms 7.887 MiB
#29 Accepted 65ms 8.008 MiB
#30 Accepted 41ms 7.52 MiB
#31 Accepted 40ms 7.52 MiB
#32 Accepted 137ms 15.316 MiB
#33 Accepted 116ms 15.527 MiB
#34 Accepted 40ms 7.488 MiB
#35 Accepted 40ms 7.488 MiB
#36 Accepted 64ms 8.047 MiB
#37 Accepted 66ms 7.852 MiB
#38 Accepted 43ms 7.535 MiB
#39 Accepted 63ms 8.016 MiB
#40 Accepted 68ms 8.023 MiB
#41 Accepted 65ms 7.852 MiB
#42 Accepted 45ms 7.438 MiB
#43 Accepted 46ms 7.637 MiB
#44 Accepted 41ms 7.52 MiB
#45 Accepted 39ms 7.562 MiB
#46 Accepted 73ms 8.008 MiB
#47 Accepted 40ms 7.52 MiB
#48 Accepted 41ms 7.457 MiB
#49 Accepted 65ms 7.934 MiB
#50 Accepted 50ms 7.566 MiB

Code

#include <bits/stdc++.h>
using namespace std;

#define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);
using ll = long long;

const ll INF = 1'000'000'000'000'000'000;
const int MX = 100001;
const int MX_K = 301;
vector<int> g[MX];
ll a[MX];
ll curr_path[MX_K], mx_path[MX_K];
bool taken[MX];
int sub[MX], centroid[MX];
ll ANS;
int k;

void sub_dfs(int u, int p = -1) {
  sub[u] = 1;

  for (int v : g[u]) {
    if ((v == p) || taken[v]) continue;
    sub_dfs(v, u);
    sub[u] += sub[v];
  }
}

int find_centroid(int mx_sub, int u, int p = -1) {
  for (int v : g[u]) {
    if ((v == p) || taken[v]) continue;
    if (sub[v] > mx_sub) return find_centroid(mx_sub, v, u);
  }
  return u;
}

void go(int dep, ll val, int u, int p = -1) {
  if (dep > k) return;
  curr_path[dep] = max(curr_path[dep], val);
  for (int v : g[u]) if (!taken[v]) {
    if (v == p) continue;
    go(dep + 1, val + a[v], v, u);
  }
}

void decompose(int u, int p = -1) {
  sub_dfs(u);

  int root = find_centroid(sub[u]/2, u);
  taken[root] = 1;
  centroid[root] = (p == -1) ? root : p;
  
  int i;
  for (i = 0; i <= k; ++i) mx_path[i] = 0;
  mx_path[0] = a[root];
  
  for (int v : g[root]) if (!taken[v]) {
    for (i = 0; i <= k; ++i) curr_path[i] = -INF;
    curr_path[0] = a[root];
    go(1, a[root] + a[v], v, root);
    for (i = 0; i <= k; ++i) {
      ANS = max(ANS, curr_path[i] + mx_path[k-i] - a[root]);
    }
    for (i = 0; i <= k; ++i) {
      mx_path[i] = max(mx_path[i], curr_path[i]);
    }
  }

  ANS = max(ANS, mx_path[k]);

  for (int v : g[root]) {
    if (taken[v]) continue;
    decompose(v, root);
  }
}

vector<int> get_dis(int n, int u) {
  vector<int> dis(n, -1);
  queue<int> q;
  dis[u] = 0;
  q.push(u);

  while (!q.empty()) {
    u = q.front(); q.pop();
    for (int v : g[u]) {
      if (dis[v] == -1) {
        dis[v] = dis[u] + 1;
        q.push(v);
      }
    }
  }

  return dis;
}

void init(int n) {
  for (int i = 0; i <= n; ++i) {
    g[i].clear();
    taken[i] = 0;
  }
}

int main() {
  FAST;

  int n, i, u, v;
  cin >> n >> k;
  --k;
  init(n);

  for (i = 0; i < n; ++i) cin >> a[i];

  for (i = 1; i < n; ++i) {
    cin >> u >> v;
    --u; --v;
    g[u].push_back(v);
    g[v].push_back(u);
  }

  vector<int> dis = get_dis(n, 0);
  int x = *max_element(dis.begin(), dis.end());
  for (u = 0; u < n; ++u) {
    if (dis[u] == x) break;
  }
  dis = get_dis(n, u);
  x = *max_element(dis.begin(), dis.end());

  ANS = 0;
  if (x >= k) decompose(0);

  cout << ANS << "\n";

  return 0;
}

Information

Submit By
Type
Submission
Problem
P1160 Max path sum (Easy Version)
Contest
Brain Booster #8
Language
C++17 (G++ 13.2.0)
Submit At
2025-02-17 15:48:48
Judged At
2025-02-17 15:48:48
Judged By
Score
100
Total Time
137ms
Peak Memory
15.527 MiB