제출 #1208375

#제출 시각아이디문제언어결과실행 시간메모리
1208375m5588ohammed바이오칩 (IZhO12_biochips)C++20
40 / 100
2117 ms589824 KiB
#include <bits/stdc++.h> using namespace std; #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 -1e9; else return 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(1,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; } for(int j=0;j<v[i].size();j++){ for(int k=0;k<=max(1,leafs[i]);k++) dp2[j][k]=-1; } 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...