#include <bits/stdc++.h>
#define all(a) a.begin(), a.end()
#define popcount(x) __builtin_popcountll(x)
using namespace std;
using namespace chrono;
struct knapsack {
vector<int> dp;
knapsack(int capacity) : dp(capacity + 1, -1e9) { dp[0] = 0; }
void add(int cost[501], int val[501]) {
for (int i = dp.size() - 1; i >= 0; i--) {
for (int j = 1; j <= 500; j++) if (i >= cost[j]) {
dp[i] = max(dp[i], dp[i - cost[j]] + val[j]);
}
}
}
};
vector<int> adj[200000];
int a[200000], dp[200000][501];
void dfs(int u) {
knapsack KN(500);
for (int v : adj[u]) {
dfs(v);
int cost[501];
iota(cost, cost + 501, 0);
KN.add(cost, dp[v]);
}
for (int j = 1; j <= 500; j++)
dp[u][j] = KN.dp[j];
dp[u][1] = max(dp[u][1], a[u]);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,m; cin >> n >> m;
int root;
for (int i = 0; i < n; i++) {
int par; cin >> par >> a[i];
if (par == 0) root = i;
else adj[--par].push_back(i);
}
dfs(root);
cout << dp[root][m];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |