제출 #1208368

#제출 시각아이디문제언어결과실행 시간메모리
1208368m5588ohammed바이오칩 (IZhO12_biochips)C++20
0 / 100
299 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define mod 1000000007
int dp[200001][501],dp2[200001][501],leafs[200001],n,m,arr[200001];
vector <array<int,2>> v[200001];
int rt;
int solve(int last,int i,int k){
    if(dp2[i][k]!=-1) return dp2[i][k];
    int idx=v[last][i][0];
    if(i==v[last].size()-1){
        if(k>leafs[idx]) return dp2[i][k]=-1e18;
        else return dp2[i][k]=dp[idx][k];
    } 
    int ans=0;
    for(int j=0;j<=min(k,leafs[idx]);j++){
        ans=max(ans,solve(last,i+1,k-j)+dp[idx][j]);
    } 
    //exit(0);
    return dp2[i][k]=ans;
}  
void build(int i){
    if(v[i].size()==0){
        leafs[i]=1;
        return;
    }
    for(auto [j,c]:v[i]){
        build(j);
        leafs[i]+=leafs[j];
    }
    return;
}
void calc(int i){
    for(auto [j,lef]:v[i]) calc(j);
    for(int k=0;k<=max(1ll,leafs[i]);k++){
        if(k==1) dp[i][k]=arr[i];
        if(v[i].size()!=0) dp[i][k]=max(dp[i][k],solve(i,0,k));
        //cout<<i<<" "<<k<<" "<<dp[i][k]<<endl;
    }
    memset(dp2,-1,sizeof dp2);
    return;
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    memset(dp2,-1,sizeof dp2);
    cin>>n>>m;
    for(int i=1;i<n;i++){
        int p;
        cin>>p>>arr[i];
        if(p==0) rt=i;
        else v[p].push_back({i,0});
    }
    build(rt);
    for(int i=1;i<=n;i++){
        for(int j=0;j<v[i].size();j++) v[i][j][1]=leafs[v[i][j][0]];
        sort(v[i].begin(),v[i].end());
        // cout<<i<<":"<<endl;
        // for(auto [j,lef]:v[i]) cout<<j<<" "<<lef<<endl;
    }
    calc(rt);
    cout<<dp[rt][m]<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...