253452026-02-19 12:06:14PappMatyasTársaság (50)cpp17Hibás válasz 7/5096ms988 KiB
#include <iostream>
#include <vector>

using namespace std;

struct int2
{
	int x;
	int y;
};

vector<int2> above;
vector<vector<int2>> below;
vector<int2> lengths;
vector<bool> leaders;
vector<int> lIndex;

static int2 GetMax(int index, int2 maxim)
{
	if (index == 0)
	{
		return maxim;
	}
	if (above[index].y > maxim.y && !leaders[index])
	{
		maxim.x = index;
		maxim.y = above[index].y;
	}
	return GetMax(above[index].x, maxim);
}

static void LowerBelow(int index, int val)
{
	if (lIndex[index] != -1)
	{
		lengths[lIndex[index]].x -= val;
		return;
	}
	int s = below[index].size();
	for (int i = 0; i < s; i++)
	{
		LowerBelow(below[index][i].x, val);
	}
}

static void LowerMaxim(int index, int li)
{
	int2 z{};
	z.x = 0;
	z.y = 0;
	int2 m = GetMax(index, z);
	
	leaders[m.x] = true;

	LowerBelow(m.x, m.y);
}

static void FindLengths(int index, int length)
{
	int s = below[index].size();
	if (s == 0)
	{
		int2 add{};
		add.x = length;
		add.y = index;
		lengths.push_back(add);
		lIndex[index] = lengths.size() - 1;
		return;
	}
	for (int i = 0; i < s; i++)
	{
		FindLengths(below[index][i].x, length + below[index][i].y);
	}
}

int main()
{
	int n, k;

	cin >> n >> k;

	int2 empty{};
	empty.x = -1;
	empty.y = -1;

	above.resize(n, empty);
	leaders.resize(n, false);
	below.resize(n);
	lIndex.resize(n, -1);

	for (int i = 0; i < n - 1; i++)
	{
		int val, from;
		cin >> from >> val;
		from--;
		above[i + 1].x = from;
		above[i + 1].y = val;

		int2 add{};
		add.x = i + 1;
		add.y = val;
		below[from].push_back(add);
	}
	FindLengths(0, 0);
	
	int cases = 0;
	int maxim, save, li;
	int s = lengths.size();
	while (cases < k)
	{
		maxim = -1, save = -1, li = -1;
		for (int i = 0; i < s; i++)
		{
			if (lengths[i].x > maxim)
			{
				maxim = lengths[i].x;
				save = lengths[i].y;
				li = i;
			}
		}
		LowerMaxim(save, li);
		cases++;
	}
	maxim = -1, save = -1;
	for (int i = 0; i < s; i++)
	{
		if (lengths[i].x > maxim)
		{
			maxim = lengths[i].x;
			save = lengths[i].y;
		}
	}
	cout << maxim;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base7/50
1Elfogadva0/01ms568 KiB
2Hibás válasz0/010ms564 KiB
3Hibás válasz0/31ms316 KiB
4Hibás válasz0/31ms316 KiB
5Elfogadva3/31ms316 KiB
6Hibás válasz0/31ms316 KiB
7Hibás válasz0/31ms316 KiB
8Hibás válasz0/32ms316 KiB
9Hibás válasz0/33ms488 KiB
10Hibás válasz0/38ms564 KiB
11Hibás válasz0/34ms564 KiB
12Hibás válasz0/317ms644 KiB
13Hibás válasz0/414ms608 KiB
14Hibás válasz0/48ms820 KiB
15Hibás válasz0/48ms924 KiB
16Elfogadva4/496ms988 KiB
17Hibás válasz0/410ms816 KiB