제출 #950608

#제출 시각아이디문제언어결과실행 시간메모리
950608socpiteWorst Reporter 4 (JOI21_worst_reporter4)C++14
79 / 100
498 ms105416 KiB
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5+5;
const int INF = 1e9+5;

vector<int> tree[maxn];
multiset<pair<int, int>, greater<>> st[maxn];

int C[maxn], H[maxn];

void dfs(int x){
    for(auto v: tree[x]){
        dfs(v);
        if(st[v].size() > st[x].size())st[x].swap(st[v]);
    }
    for(auto v: tree[x]){
        for(auto ele: st[v])st[x].insert(ele);
    }
    st[x].insert({H[x], C[x]});
    auto it = st[x].upper_bound({H[x], 0});
    while(it != st[x].end() && C[x]){
        if(it->second > C[x]){
            pair<int, int> nw = *it;
            nw.second -= C[x];
            st[x].erase(it);
            st[x].insert(nw);
            C[x] = 0;
        }
        else {
            C[x] -= it->second;
            it = st[x].erase(it);
        }
    }
    // cout << "SUS " << x << endl;
    // for(auto ele: st[x])cout << ele.first << " " << ele.second << endl;
}

int main() {
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        int p;
        cin >> p >> H[i] >> C[i];
        if(i > 1)tree[p].push_back(i);
    }
    long long sum = accumulate(C, C+n+1, 0LL);
    dfs(1);
    for(auto ele: st[1])sum -= ele.second;
    cout << sum;
}

// 4 = 4 cost 9
// 6 = 5 cost 6
// 2 = 3 cost 6
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...