Submission #1304219

#TimeUsernameProblemLanguageResultExecution timeMemory
1304219the_commando_xGondola (IOI14_gondola)C++17
55 / 100
15 ms6044 KiB
#include "gondola.h"

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

int valid(int n, int inputSeq[])
{
	unordered_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());
	reverse(chains.begin(), chains.end());

	int idx = 0, nextReplacement = n + 1;

	while (chains.size() > 1)
	{
		if (chains.back().first > nextReplacement)
		{
			replacementSeq[idx++] = chains[0].second;
			chains[0].second = nextReplacement;
		}
		else
		{
			replacementSeq[idx++] = chains.back().second;
			chains.pop_back();
		}
		++nextReplacement;
	}

	if (chains.size())
		while (nextReplacement <= chains[0].first)
		{
			replacementSeq[idx++] = chains[0].second;
			chains[0].second = nextReplacement++;
		}

	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...