Submission #1249101

#TimeUsernameProblemLanguageResultExecution timeMemory
1249101Chris_BlackFireworks (APIO16_fireworks)C++20
100 / 100
190 ms109128 KiB
//#pragma GCC optimize("Ofast")
//#pragma GCC target("avx2")

#include <bits/stdc++.h>

#define ll long long
#define vi vector<int>
#define vvi vector<vi>
#define pb push_back
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define FORR(i, a, b) for(int i = a; i >= b; --i)
#define pii pair<int, int>
#define ff first
#define ss second
#define pll pair<ll, ll>
#define vpi vector<pii>
#define vvpi vector<vpi>
#define vpl vector<pll>
#define vvpl vector<vpl>
#define vl vector<ll>
#define vvl vector<vl>
//#define x first
//#define y second


using namespace std;
const int N = 1e6 + 9, LGV = 33, LGN = 21, Mod = 1e9 + 7;
//const int Inf = 0x3f3f3f3f;
const ll Inf = LLONG_MAX / 2;
const bool test_case = false;

//ifstream fin("landscape.in");
//ofstream fout("landscape.out");
//#define cin fin
//#define cout fout

int n, m, t[N], cst[N];

priority_queue<ll> q[N];

vvi G(N);

void Dfs(int x = 1, int p = 0)
{
    if(G[x].size() == 0 && x != 1)
    {
        q[x].push(cst[x]);
        q[x].push(cst[x]);


//        {
//        vi v;
//        while(!q[x].empty())
//        {
//            v.pb(q[x].top());
//            q[x].pop();
//        }
//        reverse(v.begin(), v.end());
//        cout << x << " : ";
//        for(auto e : v)cout << e << ' ';
//        cout << '\n';
//        for(auto e : v)q[x].push(e);
//    }
        return;
    }

    for(auto y : G[x])
    {
        Dfs(y, x);

        if(q[x].size() < q[y].size())
            swap(q[x], q[y]);

        while(!q[y].empty())
        {
            q[x].push(q[y].top());
            q[y].pop();
        }
    }

    for(int i = 1; i < G[x].size(); ++i)
        q[x].pop();

    ll v1 = q[x].top(); q[x].pop();
    ll v2 = q[x].top(); q[x].pop();
    q[x].push(v1 + cst[x]);
    q[x].push(v2 + cst[x]);

//    if(x == 3)
//    {
//        vi v;
//        while(!q[x].empty())
//        {
//            v.pb(q[x].top());
//            q[x].pop();
//        }
//        reverse(v.begin(), v.end());
//        cout << x << " : ";
//        for(auto e : v)cout << e << ' ';
//        cout << '\n';
//        for(auto e : v)q[x].push(e);
//    }
}

void solve()
{
    cin >> n >> m;

    int p, c;
    FOR(i, 2, n + m)
    {
        cin >> p >> c;
        t[i] = p; cst[i] = c;
        G[p].pb(i);
    }

    Dfs(1, 0);

//    vi v;
//    while(!q[1].empty())
//    {
//        v.pb(q[1].top());
//        q[1].pop();
//    }
//    reverse(v.begin(), v.end());
//    for(auto e : v)cout << e << ' ';
//    cout << '\n';

    ll ans = 0;
    FOR(i, 1, n + m)ans += cst[i];

    q[1].pop();
    while(!q[1].empty())
    {
        ans -= q[1].top();
        q[1].pop();
    }

    cout << ans << '\n';
}

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

    int t = 1;
    if(test_case)cin >> t;
    while(t --)solve();
    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...