Submission #1304213

#TimeUsernameProblemLanguageResultExecution timeMemory
1304213the_commando_xGondola (IOI14_gondola)C++17
55 / 100
988 ms6088 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 = 0;
	for (int i = 0; i < n; ++i)
		if (gondolaSeq[i] <= n)
		{
			start = i;
			break;
		}

	int base = gondolaSeq[start];

	vector<pair<int, int>> chains; // {final replacement number, current replacement number}

	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, nextReplacement = n + 1;

	while (chains.size())
	{
		// END A CHAIN
		bool finished = false;
		for (int i = 0; i < 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;
		}

		// * EXTEND A CHAIN
		for (auto &c : chains)
		{
			if (c.first > nextReplacement)
			{
				replacementSeq[idx++] = c.second;
				c.second = nextReplacement++;
				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...