154602025-02-19 17:54:32GervidTársaság (50)cpp17Elfogadva 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/07ms564 KiB
3Elfogadva3/31ms316 KiB
4Elfogadva3/31ms316 KiB
5Elfogadva3/31ms500 KiB
6Elfogadva3/31ms316 KiB
7Elfogadva3/31ms316 KiB
8Elfogadva3/32ms464 KiB
9Elfogadva3/32ms500 KiB
10Elfogadva3/34ms316 KiB
11Elfogadva3/34ms620 KiB
12Elfogadva3/37ms564 KiB
13Elfogadva4/48ms628 KiB
14Elfogadva4/48ms564 KiB
15Elfogadva4/49ms564 KiB
16Elfogadva4/412ms564 KiB
17Elfogadva4/413ms820 KiB