#include<bits/stdc++.h>
using namespace std;
#define f1(n) for(int i=0;i<n;i++)
#define f2(m,n,q) for(int i=m;i<n;i+=q)
#define f4(m,n,q) for(int j=m;j<n;j+=q)
#define int long long
const int N=1e5+5,inf=1e18;
int n,m,w[N];vector<int>g[N],dp[N];
void dfs(int u){
dp[u]=vector<int>(1,0);
int s=0;
for(int v:g[u]){
dfs(v);
int sv=dp[v].size(),nu=min(m,s+sv);
vector<int>nx(nu+1,-inf);
f2(0,s+1,1){
if(dp[u][i]<-inf)continue;
f4(0,sv,1){
if(dp[v][j]<-inf||i+j>m)continue;
nx[i+j]=max(nx[i+j],dp[u][i]+dp[v][j]);
}
}
dp[u]=nx;
s=nu;
dp[v].clear();
}
if(dp[u].size()<2)dp[u].resize(2,-inf);
dp[u][1]=max(dp[u][1],w[u]);
if(dp[u].size()>m+1)dp[u].resize(m+1);
}
signed main(){
cin>>n>>m;
int r=1;
f2(1,n+1,1){
int p;cin>>p>>w[i];
if(p==0){r=i;continue;}
g[p].push_back(i);
}
dfs(r);
cout<<dp[r][m];
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |