Submission #1280789

#TimeUsernameProblemLanguageResultExecution timeMemory
1280789duckindogWorst Reporter 4 (JOI21_worst_reporter4)C++20
0 / 100
9 ms10564 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 200'000 + 10,
            MAX = 1'000'000'000;
int n;
pair<int, int> cons[N];
vector<int> ad[N];

int sz[N];
void dfs(int u, int p = -1) { 
    for (const auto& v : ad[u]) { 
        if (v == p) continue;
        dfs(v, u);
        sz[u] += sz[v];
    }
}

int head[N], par[N];
int st[N], ed[N], node[N], num;
void hld(int u, int p = -1) { 
    if (!head[u]) head[u] = u;
    st[u] = ++num; node[num] = u;

    sort(ad[u].begin(), ad[u].end(), [&](const auto& i, const auto& j) { 
        return sz[i] > sz[j];
    });
    bool goHeavy = false;
    for (const auto& v : ad[u]) { 
        if (v == p) continue;
        if (!goHeavy) goHeavy = true, head[v] = head[u];
        par[v] = u;
        hld(v, u);
    }

    ed[u] = num;
}
static inline bool anc(int u, int v) { return st[u] <= st[v] && ed[v] <= ed[u]; }
vector<pair<int, int>> get(int u, int v) { 
    vector<pair<int, int>> ret;

    for (; !anc(head[u], head[v]); u = par[head[u]]) { 
        ret.push_back({st[head[u]], st[u]});
    }
    for (; head[v] != head[u]; v = par[head[v]]) { 
        ret.push_back({st[head[v]], st[v]});
    }
    ret.push_back({min(st[u], st[v]), max(st[u], st[v])});

    return ret;
}

set<pair<int, int>> proc[N];

int32_t main() {
    cin.tie(0)->sync_with_stdio(0);

    cin >> n;
    for (int i = 1; i <= n; ++i) { 
        int p; cin >> p;
        if (p != i) { 
            ad[p].push_back(i);
            ad[i].push_back(p);
        }

        cin >> cons[i].first >> cons[i].second;
    }

    dfs(1);
    hld(par[1] = 1);

    vector<int> order(n); iota(order.begin(), order.end(), 1);
    sort(order.begin(), order.end(), [&](const auto& i, const auto& j) { 
        return cons[i].first > cons[j].first;
    });

    long long answer = 0;
    for (auto u : order) { 
        int saveU = u;
        
        int value = cons[u].second;
        for (; value; u = par[head[u]]) { 
            vector<pair<int, int>> add, del;
            
            auto it = proc[head[u]].upper_bound({st[u], MAX});
            while (it != proc[head[u]].begin()) { 
                it = prev(it);
                auto [p, tag] = *it;
                
                del.push_back(*it);
                if (value > tag) { 
                    value -= tag;
                } else { 
                    if (tag > value) add.push_back({p, tag - value});
                    value = 0;
                    break;
                }
            }

            for (const auto& it : del) proc[head[u]].erase(it);
            for (const auto& it : add) proc[head[u]].insert(it);

            if (u == 1) break;
        }
        u = saveU;

        proc[head[u]].insert({st[u], cons[u].second});

        answer += value;
    }
    
    answer = -answer;
    for (int i = 1; i <= n; ++i) answer += cons[i].second;

    cout << answer << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...