//#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 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... |