Submission #875621

#TimeUsernameProblemLanguageResultExecution timeMemory
875621The_SamuraiBiochips (IZhO12_biochips)C++17
80 / 100
2094 ms387344 KiB
// #pragma GCC optimize("Ofast,O3")
// #pragma GCC target("avx,avx2")
#include "bits/stdc++.h"

using namespace std;
using ll = long long;
const int inf = 2e9;

int n, k, root;
vector<vector<int>> dp, g;

void dfs(int u) {
    int val = dp[1][u]; dp[1][u] = -inf;
    dp[0][u] = 0;
    for (int v: g[u]) {
        dfs(v);
        vector<int> copy(k + 1);
        for (int i = 1; i <= k; i++) copy[i] = dp[i][u];
        for (int i = 1; i <= k; i++) {
            if (dp[i][v] == -inf) continue;
            for (int j = i; j <= k; j++) {
                if (copy[j - i] == -inf) continue;
                dp[j][u] = max(dp[j][u], dp[i][v] + copy[j - i]);
            }
        }
    }
    dp[1][u] = max(dp[1][u], val);
    // if (u != root) return;
}

void solve() {
    cin >> n >> k;
    g.assign(n + 1, {});
    dp.assign(k + 1, vector<int>(n + 1, -inf));
    for (int i = 1; i <= n; i++) {
        int p;
        cin >> p >> dp[1][i];
        if (!p) root = i;
        else g[p].emplace_back(i);
    }
    dfs(root);
    cout << dp[k][root];
}

int main() {
    cin.tie(0)->sync_with_stdio(false);
#ifdef sunnatov
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    int q = 1;
    // cin >> q;
    while (q--) {
        solve();
        cout << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...