#include <bits/stdc++.h>
using namespace std;
#define int long long
int inf = 1e18;
int n, m;
int t[300005], c[300005];
vector<int> f[300005];
vector<int> hs[5005], dp[5005];
int h[5005];
void root(int nod)
{
for (auto fiu : f[nod])
{
h[fiu] = c[fiu] + h[nod];
root(fiu);
}
if (f[nod].empty())
hs[nod].push_back(h[nod]);
else
{
for (auto fiu : f[nod])
for (auto it : hs[fiu])
hs[nod].push_back(it);
}
}
void calc(int nod)
{
for (auto fiu : f[nod])
calc(fiu);
if (f[nod].empty())
dp[nod][0] = 0;
else
{
for (int i = 0; i < hs[nod].size(); i++)
{
int ct = 0;
for (int j = 0; j < f[nod].size(); j++)
{
int mnm = inf;
int fiu = f[nod][j];
for (int q = 0; q < hs[fiu].size(); q++)
mnm = min(mnm, abs(hs[fiu][q] - hs[nod][i]) + dp[fiu][q]);
ct += mnm;
}
dp[nod][i] = ct;
}
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
n += m;
for (int i = 2; i <= n; i++)
{
cin >> t[i] >> c[i];
f[t[i]].push_back(i);
}
root(1);
for (int i = 1; i <= n; i++)
dp[i].resize(hs[i].size());
calc(1);
int mnm = inf;
for (auto it : dp[1])
mnm = min(mnm, it);
cout << mnm;
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... |