Submission #1291338

#TimeUsernameProblemLanguageResultExecution timeMemory
1291338lex._.Biochips (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...