Submission #881181

#TimeUsernameProblemLanguageResultExecution timeMemory
881181alexddBiochips (IZhO12_biochips)C++17
100 / 100
598 ms402084 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(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(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++) dp[nod][i] = max(dp[nod][i], dp[nod][j] + dp[adj][i-j]); } else { for(int j=max(0,i-siz[nod]);j<=min(siz[adj],i);j++) 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...