Submission #1304201

#TimeUsernameProblemLanguageResultExecution timeMemory
1304201the_commando_x곤돌라 (IOI14_gondola)C++17
25 / 100
39 ms4640 KiB
#include "gondola.h"

#include <bits/stdc++.h>
using namespace std;

int valid(int n, int inputSeq[])
{
	set<int> seen;
	for (int i = 0; i < n; ++i)
		if (seen.count(inputSeq[i]))
			return 0;
		else
			seen.insert(inputSeq[i]);

	int start = -1;
	for (int i = 0; i < n; ++i)
		if (inputSeq[i] <= n)
		{
			start = i;
			break;
		}

	if (start != -1)
	{
		int base = inputSeq[start];
		for (int i = 0; i < n; ++i)
		{
			int expected = (base + i - start) % n;
			if (expected <= 0)
				expected += n;

			if (inputSeq[i] <= n && inputSeq[i] != expected)
				return 0;
		}
	}

	int nextReplacement = n + 1;
	for (int i = 0; i < n; ++i)
		if (inputSeq[i] > n)
			if (inputSeq[i] < nextReplacement)
				return 0;
			else
				nextReplacement = inputSeq[i] + 1;

	return 1;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	int start = -1;
	for (int i = 0; i < n; ++i)
		if (gondolaSeq[i] <= n)
		{
			start = i;
			break;
		}

	int M = 0;
	for (int i = 0; i < n; ++i)
		M = max(M, gondolaSeq[i]);

	int totalBreaks = M - n;

	if (start == -1)
	{
		for (int i = 0; i < totalBreaks; ++i)
			replacementSeq[i] = i + 1;
		return totalBreaks;
	}

	int base = gondolaSeq[start];
	vector<pair<int, int>> chains; // {final replacement, current head}

	for (int i = 0; i < n; ++i)
	{
		int expected = (base + i - start) % n;
		if (expected <= 0)
			expected += n;

		if (gondolaSeq[i] > n)
			chains.push_back({gondolaSeq[i], expected});
	}

	sort(chains.begin(), chains.end());

	int idx = 0;
	int nextReplacement = n + 1;

	while (chains.size())
	{
		bool finished = false;

		for (int i = 0; i < (int)chains.size(); ++i)
			if (chains[i].first == nextReplacement)
			{
				replacementSeq[idx++] = chains[i].second;
				chains.erase(chains.begin() + i);
				finished = true;
				break;
			}

		if (finished)
		{
			++nextReplacement;
			continue;
		}

		bool extended = false;
		for (auto &c : chains)
			if (c.first > nextReplacement)
			{
				replacementSeq[idx++] = c.second;
				c.second = nextReplacement++;
				extended = true;
				break;
			}

		// impossible case
		if (!extended)
			break;
	}

	return idx;
}

int countReplacement(int n, int inputSeq[])
{
	return -3;
}
#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...