Submission #1208350

#TimeUsernameProblemLanguageResultExecution timeMemory
1208350sula2Biochips (IZhO12_biochips)C++20
40 / 100
2098 ms62148 KiB
#include <bits/stdc++.h>
#define all(a) a.begin(), a.end()
#define popcount(x) __builtin_popcountll(x)
using namespace std;
using namespace chrono;

struct knapsack {
    vector<int> dp;

    knapsack(int capacity) : dp(capacity + 1, -1e9) { dp[0] = 0; }

    void add(int cost[501], int val[501]) {
        for (int i = dp.size() - 1; i >= 0; i--) {
            for (int j = 1; j <= 500; j++) if (i >= cost[j]) {
                dp[i] = max(dp[i], dp[i - cost[j]] + val[j]);
            }
        }
    }
};

vector<int> adj[200000];
int a[200000], dp[200000][501];

void dfs(int u) {
    knapsack KN(500);
    for (int v : adj[u]) {
        dfs(v);
        int cost[501];
        iota(cost, cost + 501, 0);
        KN.add(cost, dp[v]);
    }
    for (int j = 1; j <= 500; j++)
        dp[u][j] = KN.dp[j];
    dp[u][1] = max(dp[u][1], a[u]);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n,m; cin >> n >> m;
    int root;
    for (int i = 0; i < n; i++) {
        int par; cin >> par >> a[i];
        if (par == 0) root = i;
        else adj[--par].push_back(i);
    }
    dfs(root);
    cout << dp[root][m];
}
#Verdict Execution timeMemoryGrader output
Fetching results...