제출 #1291338

#제출 시각아이디문제언어결과실행 시간메모리
1291338lex._.바이오칩 (IZhO12_biochips)C++20
30 / 100
2098 ms51260 KiB
#include <bits/stdc++.h> #define NMAX 200001 #define MMAX 501 using namespace std; int n, m; int memorie[NMAX]; vector<int> fii[NMAX]; int nr_frunze[NMAX]; ///nr_frunze[i]=numarul de frunze al subarborelui lui i void precalc(int nod) { if(fii[nod].empty()) nr_frunze[nod]=1; for(auto& fiu : fii[nod]) { precalc(fiu); nr_frunze[nod]+=nr_frunze[fiu]; } } int dp[NMAX][MMAX]; ///dp[i][j] = memoria maxima daca luam j cipuri dintr-un subarbore de-al lui i void dfs(int nod) { for(auto& fiu : fii[nod]) { dfs(fiu); for(int j=nr_frunze[nod]; j>=1; j--) { for(int k=0; k<=nr_frunze[fiu] && k<=j; k++) { dp[nod][j]=max(dp[nod][j], dp[fiu][k]+dp[nod][j-k]); ///luam k valori din subarborele fiului si j-k valori din subarborii fiilor parcursi pana acum } } } dp[nod][1]=max(dp[nod][1], memorie[nod]); ///daca luam cipul nod } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> m; int radacina; for(int i=1; i<=n; i++) { int tata; cin >> tata >> memorie[i]; if(tata==0) radacina=i; else fii[tata].push_back(i); } precalc(radacina); ///precalculam numarul de frunze al fiecarui subarbore dfs(radacina); cout << dp[radacina][m]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...