Submission #163518

#TimeUsernameProblemLanguageResultExecution timeMemory
163518faremyTeleporters (IOI08_teleporters)C++14
100 / 100
475 ms29688 KiB
#include <iostream>
#include <algorithm>
#include <vector>


const int MAXN = 2e6 + 2;

int warp[MAXN], next[MAXN];
bool seen[MAXN];

std::vector<int> cycleSizes;


int floodfill(int pos)
{
	if (seen[pos])
		return 0;
	seen[pos] = true;
	return (floodfill(warp[next[pos]]) + 1);
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cout.tie(nullptr);
	std::cin.tie(nullptr);

	std::fill_n(warp, MAXN, -1);
	warp[0] = 0;
	warp[MAXN - 1] = MAXN - 1;

	int teleporters, canAdd;
	std::cin >> teleporters >> canAdd;

	for (int iTel = 0; iTel < teleporters; iTel++)
	{
		int west, east;
		std::cin >> west >> east;
		warp[west] = east;
		warp[east] = west;
	}

	int lastSeen = MAXN - 1;
	next[MAXN - 1] = MAXN - 1;

	for (int iPos = MAXN - 2; iPos > -1; iPos--)
		if (warp[iPos] != -1)
		{
			next[iPos] = lastSeen;
			lastSeen = iPos;
		}

	int score = floodfill(0) - 2;
	for (int iPos = 1; iPos < MAXN - 1; iPos++)
		if (!seen[iPos] && warp[iPos] != -1)
			cycleSizes.emplace_back(floodfill(iPos));

	std::sort(cycleSizes.rbegin(), cycleSizes.rend());
	for (int iCyc = 0; iCyc < (int)cycleSizes.size() && canAdd > 0; iCyc++)
	{
		score += cycleSizes[iCyc] + 2;
		canAdd--;
	}

	std::cout << score + canAdd * 2 - canAdd % 2 << '\n';

	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...