제출 #1291390

#제출 시각아이디문제언어결과실행 시간메모리
1291390lex._.바이오칩 (IZhO12_biochips)C++20
100 / 100
324 ms394708 KiB
#include <bits/stdc++.h> #define NMAX 200002 #define MMAX 501 using namespace std; int n, m, cnt=0; int memorie[NMAX]; vector<int> fii[NMAX]; int liniar[NMAX]; ///liniarizarea arborelui int nr_frunze[NMAX]; ///nr_frunze[i] = numarul de frunze din intervalul [i...n] al liniarizarii int fin[NMAX]; ///fin[i] = pozitia unde se termina subarborele lui i void dfs(int nod) { liniar[++cnt]=nod; for(auto& fiu : fii[nod]) { dfs(fiu); } fin[nod]=cnt+1; } int dp[NMAX][MMAX]; ///dp[i][j] = memoria maxima daca luam j cipuri din intervalul [i...n] 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); } dfs(radacina); ///liniarizam arborele for(int i=n; i>=1; i--) { if(fii[liniar[i]].empty()) ///daca nodul este o frunza nr_frunze[i]++; int max_alese=1+nr_frunze[fin[liniar[i]]]; ///numarul maxim de noduri din intervalul [i...n] pe care le putem alege for(int j=1; j<=m && j<=max_alese; j++) { dp[i][j]=memorie[liniar[i]]+dp[fin[liniar[i]]][j-1]; ///cazul in care luam nodul liniar[i] } for(int j=1; j<=m; j++) dp[i][j]=max(dp[i][j], dp[i+1][j]); ///maxime partiale pe dp nr_frunze[i]+=nr_frunze[i+1]; ///sume partiale pe numarul de frunze } cout << dp[1][m]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...