154602025-02-19 17:54:32GervidTársaság (50)cpp17Accepted 50/5013ms820 KiB
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <limits.h>
#include <algorithm>
#include <math.h>
#include <array>

using namespace std;
using ll = long long;

vector<vector<array<int, 2>>> g;
ll used, treshold;

array<ll, 2> dfs(int node, int cost) //maxd, covered
{
	ll maxd = 0, maxc = 0;
	for (array<int, 2> neighbour : g[node])
	{
		array<ll, 2> r = dfs(neighbour[0], neighbour[1]);
		maxd = max(maxd, r[0]);
		maxc = max(maxc, r[1]);
	}
	if (maxd + cost > maxc && maxd + cost > treshold)
	{
		used++;
		return { 0, max(0LL, treshold - cost) };
	}
	return { maxd + cost, max(0LL, maxc - cost) };
}

int main()
{
	iostream::sync_with_stdio(0);
	cin.tie(0);

	int n, k, i;
	cin >> n >> k;

	g.resize(n);
	for (i = 1; i < n; i++)
	{
		int p, w;
		cin >> p >> w;
		g[--p].push_back({ i, w });
	}

	ll l = 0, r = 1'000'000'000'000'000LL;
	while (l < r)
	{
		treshold = (l + r) / 2;
		used = 0;
		dfs(0, 0);
		if (used > k) l = treshold + 1;
		else r = treshold;
	}
	cout << l;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms316 KiB
2Accepted0/07ms564 KiB
3Accepted3/31ms316 KiB
4Accepted3/31ms316 KiB
5Accepted3/31ms500 KiB
6Accepted3/31ms316 KiB
7Accepted3/31ms316 KiB
8Accepted3/32ms464 KiB
9Accepted3/32ms500 KiB
10Accepted3/34ms316 KiB
11Accepted3/34ms620 KiB
12Accepted3/37ms564 KiB
13Accepted4/48ms628 KiB
14Accepted4/48ms564 KiB
15Accepted4/49ms564 KiB
16Accepted4/412ms564 KiB
17Accepted4/413ms820 KiB