Submission #881175

#TimeUsernameProblemLanguageResultExecution timeMemory
881175alexddBiochips (IZhO12_biochips)C++17
100 / 100
478 ms403792 KiB
#include<iostream> #include<vector> using namespace std; const int INF = 1e9; int n,m,root; vector<int> con[200005]; int a[200005]; int siz[200005]; int dp[200005][505]; void dfs(int nod) { for(int i=1;i<=m;i++) dp[nod][i] = -INF; for(auto adj:con[nod]) { dfs(adj); for(int i=min(m,siz[nod]+siz[adj]);i>0;i--) { ///j <= siz[nod] ///i-j <= siz[adj] => j >= i - siz[adj] ///i-j >= 0 => j <= i if(1 || min(siz[nod],i) - max(0,i-siz[adj]) < min(siz[adj],i) - max(0,i-siz[nod])) { for(int j=max(0,i-siz[adj]);j<=min(siz[nod],i);j++) { if(i-j<=0) continue; dp[nod][i] = max(dp[nod][i], dp[nod][j] + dp[adj][i-j]); } } else { for(int j=0;j<=i;j++) { if(i-j>0) dp[nod][i] = max(dp[nod][i], dp[nod][i-j] + dp[adj][j]); } } } siz[nod]=min(siz[nod]+siz[adj],m); } dp[nod][1] = max(dp[nod][1], a[nod]); siz[nod] = max(siz[nod], 1); } signed main() { ios_base::sync_with_stdio(0);cin.tie(0); cin>>n>>m; int p; for(int i=1;i<=n;i++) { cin>>p>>a[i]; if(p!=0) con[p].push_back(i); else root = i; } dfs(root); cout<<dp[root][m]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...