Submission #1295844

#TimeUsernameProblemLanguageResultExecution timeMemory
1295844dooweyFireworks (APIO16_fireworks)C++20
0 / 100
6 ms9788 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<ll, ll> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = (int)3e5 + 10;

ll A[N], B[N];
vector<pii> T[N];
priority_queue<ll> que[N];

void dfs(int u, ll in){
    if(T[u].empty()){
        que[u].push(in);
        que[u].push(in);
        A[u] = 1;
        B[u] = -in;
        return;
    }
    for(auto x : T[u]){
        dfs(x.fi, x.se);
        A[u] += A[x.fi];
        B[u] += B[x.fi]; 
        if(que[u].size() < que[x.fi].size()) swap(que[u], que[x.fi]);
        while(!que[x.fi].empty()){
            que[u].push(que[x.fi].top());
            que[x.fi].pop();
        }
    }
    while(A[u] > 1){
        A[u] -- ;
        B[u] += que[u].top();
        que[u].pop();
    }

    A[u] = 1;
    B[u] = -in;

    ll p1 = que[u].top();
    que[u].pop();
    ll p2 = que[u].top();
    que[u].pop();
    
    que[u].push(p1 + in);
    que[u].push(p2 + in);
}

int main(){
    fastIO;
    int n, m;
    cin >> n >> m;
    int par, c;
    for(int i = 2; i <= n + m ; i ++ ){
        cin >> par >> c;
        T[par].push_back(mp(i, c));
    }
    dfs(1, 1);
    while(A[1] > 0){
        A[1] -- ;
        B[1] += que[1].top();
        que[1].pop();   
    }
    cout << B[1] << "\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...