Submission #1294063

#TimeUsernameProblemLanguageResultExecution timeMemory
1294063moha1111Biochips (IZhO12_biochips)C++20
100 / 100
286 ms18996 KiB
#include <bits/stdc++.h>
#define all(a) a.begin() , a.end()
using namespace std;
#define int long long

vector<int> graph[200005] , v(200005);
int n , m;

vector<int> dfs(int node , int par)
{
    vector<int> dp = {0 , 0} , nedp(m + 5, 0);
    for(auto i : graph[node])
    {
        if(i != par)
        {
            vector<int> curdp = dfs(i , node);
            for(int i = 0 ; i < min((int)dp.size() , m + 1) ; i++)
            {
                for(int j = 0 ; j < min((int)curdp.size() , m + 1) ; j++)
                {
                    if(i + j > m)
                        break;

                    nedp[i + j] = max(dp[i] + curdp[j] , nedp[i + j]);
                }
            }
            dp = nedp;
            for(int i = 0 ; i <= 1 + m ; i++)
                nedp[i] = 0;
        }
    }
    dp[1] = max(v[node] , dp[1]);
    return dp;
}

void solve()
{
    cin >> n >> m;
    int ro = -1;
    for(int i = 1 ; i <= n ; i++)
    {
        int a;
        cin >> a >> v[i];
        if(a == 0)
            ro = i;

        else
        {
            graph[a].push_back(i);
            graph[i].push_back(a);
        }
    }
    vector<int> f = dfs(ro , -1);

    cout << f[m];
}

signed main()
{

    // usaco("triangles");
    int t = 1;
    //cin >> t;
    while(t--)
        solve();

}
#Verdict Execution timeMemoryGrader output
Fetching results...