Submission #939377

#TimeUsernameProblemLanguageResultExecution timeMemory
939377AlcabelFireworks (APIO16_fireworks)C++17
100 / 100
210 ms79184 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 3e5;
priority_queue<long long> dp[maxn];
long long val[maxn];
int slope[maxn];
vector<int> g[maxn];
int par[maxn], c[maxn];

/*void print(int v) {
    vector<long long> res;
    {
        auto tmp = down[v];
        while (!tmp.empty()) {
            res.emplace_back(tmp.top());
            tmp.pop();
        }
        reverse(res.begin(), res.end());
    }
    {
        auto tmp = up[v];
        while (!tmp.empty()) {
            res.emplace_back(tmp.top() + modUp[v]);
            tmp.pop();
        }
        for (const int& x : res) {
            cerr << x << ' ';
        }
        cerr << '\n';
    }
}*/

void dfs(int v) {
    if (g[v].empty()) {
        val[v] = c[v];
        slope[v] = -1;
        dp[v].emplace(c[v]);
        dp[v].emplace(c[v]);
        return;
    }
    for (const int& u : g[v]) {
        dfs(u);
        if (dp[v].size() < dp[u].size()) {
            swap(dp[v], dp[u]);
            swap(val[v], val[u]);
            swap(slope[v], slope[u]);
        }
        slope[v] += slope[u];
        val[v] += val[u];
        while (!dp[u].empty()) {
            dp[v].emplace(dp[u].top());
            dp[u].pop();
        }
    }
    // cerr << "v: " << v + 1 << " before:\n";
    // print(v);
    if (par[v] != -1) {
        val[v] += c[v];
        while (slope[v] + (int)dp[v].size() > 1) {
            dp[v].pop();
        }
        long long last = dp[v].top();
        dp[v].pop();
        long long prelast = dp[v].top();
        dp[v].pop();
        dp[v].emplace(prelast + c[v]);
        dp[v].emplace(last + c[v]);
    }
    // cerr << "v: " << v + 1 << ", val: " << val[v] << ", slope: " << slope[v] << '\n';
    // print(v);
}

void solve() {
    int n, m;
    cin >> n >> m;
    par[0] = -1, c[0] = 0;
    for (int i = 1; i < n + m; ++i) {
        cin >> par[i] >> c[i];
        --par[i];
        g[par[i]].emplace_back(i);
    }
    dfs(0);
    while (slope[0] + (int)dp[0].size() > 0) {
        dp[0].pop();
    }
    long long ans = val[0];
    vector<long long> leftPart;
    while (!dp[0].empty()) {
        leftPart.emplace_back(dp[0].top());
        dp[0].pop();
    }
    leftPart.emplace_back(0);
    reverse(leftPart.begin(), leftPart.end());
    for (int i = 0; i < (int)leftPart.size() - 1; ++i) {
        ans += (slope[0] + i) * (leftPart[i + 1] - leftPart[i]);
    }
    cout << ans << '\n';
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    int T = 1;
    cin >> T;
    while (T--) {
        solve();
        cerr << "-----------\n";
        cout << "-----------\n";
    }
#else
    int T = 1;
    // cin >> T;
    while (T--) {
        solve();
    }
#endif
 
    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...