#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |