#include <iostream>
#include <vector>
using namespace std;
const int N = 1<<18;
vector<int> nei[N];
int dp[N][2], ch[N], cur, a[N], mem[N];
void dfs(int u){
ch[u] = 1;
for (int i : nei[u])
dfs(i), ch[u] += ch[i];
a[++cur] = u;
}
int main(){
int n, m;
cin>>n>>m;
for (int i=1, p;i<=n;i++){
cin>>p>>mem[i];
nei[p].push_back(i);
}
dfs(nei[0][0]);
for (int i=0;i<N;i++)
dp[i][1] = -1e9;
for (int j=1;j<=m;j++){
for (int i=1;i<=n;i++)
dp[i][1] = max(dp[i-1][1], dp[i - ch[a[i]]][0] + mem[a[i]]);
for (int i=0;i<=n;i++)
dp[i][0] = dp[i][1], dp[i][1] = -1e9;
}
cout<<dp[n][0]<<'\n';
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |