Submission #1206884

#TimeUsernameProblemLanguageResultExecution timeMemory
1206884basa바이오칩 (IZhO12_biochips)C++20
100 / 100
547 ms409156 KiB
#include <bits/stdc++.h>

using namespace std;

const int M = 505;
const int maxn = 2e5 + 5;

int n, m;
int sz[maxn];
int val[maxn];
int dp[maxn][M];
vector<int>adj[maxn];

void calcsz(int v, int p){
  for(int i : adj[v]){
    if(i == p) continue;
    calcsz(i, v);
    sz[v] += sz[i];
  }
  sz[v] += adj[v].size();
}

void dfs(int v, int p){
  int tmp[m + 5] = {};

  int cnt = 0;
  for(int i : adj[v]){
    if(i == p) continue;
    dfs(i, v);
    cnt++;

    for(int j = 1; j <= min(m, sz[v]); j++){
      for(int k = 0; k <= min(j, sz[i]); k++){
        int l = j - k;
        dp[v][j] = max(dp[i][k] + tmp[l], dp[v][j]);
      }
    }

    for(int j = 1; j <= min(m, sz[v]); j++) tmp[j] = dp[v][j];
  }

  dp[v][1] = max(dp[v][1], val[v]);
}

signed main()
{
  cin.tie(0) -> sync_with_stdio(0);
  cin >> n >> m;

  int rt;
  for(int i = 1; i <= n; i++){
    int p, w;
    cin >> p >> w;

    if(p == 0) rt = i;

    val[i] = w;
    adj[i].push_back(p);
    adj[p].push_back(i);
  }

  calcsz(rt, 0);
  dfs(rt, 0);
  cout << dp[rt][m];
}
#Verdict Execution timeMemoryGrader output
Fetching results...