Submission #208243

#TimeUsernameProblemLanguageResultExecution timeMemory
208243SortingGondola (IOI14_gondola)C++14
100 / 100
33 ms2152 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

bool check_valid_pair(int lvalue, int rvalue, int n){
	if(lvalue <= 0 || rvalue <= 0)
		return false;
	if(lvalue > n || rvalue > n)
		return true;
	if((lvalue + 1) % n != rvalue % n)
		return false;
	return true;
}

int valid(int n, int inputSeq[]){
	if(n == 1)
		return true;

	for(int i = 0; i < n - 1; ++i)
		if(!check_valid_pair(inputSeq[i], inputSeq[i + 1], n))
			return false;

	if(!check_valid_pair(inputSeq[n - 1], inputSeq[0], n))
		return false;

	sort(inputSeq, inputSeq + n);
	for(int i = 0; i < n - 1; ++i)
		if(inputSeq[i] == inputSeq[i + 1])
			return false;

	return true;
}

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

	vector<pair<int, int>> v(n);
	for(int i = 0; i < n; ++i)
		v[i] = {gondolaSeq[i], i};
	sort(v.begin(), v.end());

	int cnt_replacement = 0, new_n = n;
	for(int i = 0; i < n; ++i){
		int idx;
		if(v[i].second >= start)
			idx = v[i].second + 1 - start;
		else
			idx = n + v[i].second + 1 - start;

		if(v[i].first > n){
			replacementSeq[cnt_replacement++] = idx;
			++new_n;
			while(v[i].first != new_n){
				replacementSeq[cnt_replacement++] = new_n;
				++new_n;
			}
		}
	}

	return cnt_replacement;
}

const long long mod = 1e9 + 9;

long long fpow(long long base, long long exp){
	if(!exp)
		return 1;
	if(exp & 1)
		return fpow(base, exp ^ 1) * base % mod;

	long long t = fpow(base, exp >> 1);
	return t * t % mod;
}

int countReplacement(int n, int inputSeq[]){
	if(!valid(n, inputSeq))
		return 0;

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

	int cnt_changed = 0;
	for(int i = 0; i < n; ++i)
		if(inputSeq[i] > n)
			++cnt_changed;

	vector<pair<int, int>> v(n);
	for(int i = 0; i < n; ++i)
		v[i] = {inputSeq[i], i};
	sort(v.begin(), v.end());

	int new_n = n;
	long long ans = 1;
	for(int i = 0; i < n; ++i){
		if(v[i].first > n){
			ans *= fpow(cnt_changed, v[i].first - new_n - 1);
			ans %= mod;
			new_n = v[i].first;
			--cnt_changed;
		}
	}

	if(!start_exists){
		ans *= n;
		ans %= mod;
	}

	return ans;
}
#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...