Submission #1185365

#TimeUsernameProblemLanguageResultExecution timeMemory
1185365woohyun_jngMagic Tree (CEOI19_magictree)C++20
100 / 100
83 ms37192 KiB
#include <bits/stdc++.h>
#define int long long

using namespace std;
typedef array<int, 2> pr;

const int MAX = 100001;

int D[MAX], W[MAX];
vector<int> adj[MAX];

multiset<pr> dfs(int node) {
    multiset<pr> res, tmp;
    multiset<pr>::iterator iter;

    int X = 0;
    pr K;

    for (int i : adj[node]) {
        tmp = dfs(i);
        if (tmp.size() > res.size())
            swap(res, tmp);
        for (pr j : tmp)
            res.insert(j);
    }

    if (D[node] != 0) {
        while (true) {
            iter = res.lower_bound({D[node] + 1, 0});
            if (iter == res.end())
                break;
            K = *iter, X += K[1], res.erase(iter);
            if (X > W[node]) {
                res.insert({K[0], X - W[node]});
                break;
            }
        }
        res.insert({D[node], W[node]});
    }

    return res;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int N, M, K, X, Y, Z, ans = 0;

    cin >> N >> M >> K;
    for (int i = 2; i <= N; i++)
        cin >> X, adj[X].push_back(i);

    while (M--) {
        cin >> X >> Y >> Z;
        D[X] = Y, W[X] = Z;
    }

    multiset<pr> ret = dfs(1);
    for (pr i : ret)
        ans += i[1];

    cout << ans << '\n';

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...