Submission #355623

#TimeUsernameProblemLanguageResultExecution timeMemory
355623MefarnisGondola (IOI14_gondola)C++14
100 / 100
69 ms6380 KiB
#include <bits/stdc++.h>
#include "gondola.h"
#define maxn 100003
#define maxv 250001
#define mod 1000000009
using namespace std;
typedef long long LL;

int idx[maxv];
int init[maxn];

void calcInit(int n, int inputSeq[], int minIdx) {
	if(minIdx == -1)
		for( int i = 0 ; i < n ; i++ )
			init[i] = i+1;
	else
		for( int i = 0 ; i < n ; i++ ) {
			int d = (i-minIdx+n) % n;
			init[i] = inputSeq[minIdx]+d;
			if(init[i] > n)
				init[i] -= n;
		}
}

int valid(int n, int inputSeq[]) {
	int minIdx = -1;
	set<int> s;
	for( int i = 0 ; i < n ; i++ ) {
		if(s.find(inputSeq[i]) != s.end())
			return 0;
		s.insert(inputSeq[i]);
		if(inputSeq[i] <= n) {
			if(minIdx == -1 || inputSeq[i] < inputSeq[minIdx])
				minIdx = i;
		}
	}
	calcInit(n,inputSeq,minIdx);
	if(minIdx == -1)
		return 1;
	for( int i = 0 ; i < n ; i++ )
		if(inputSeq[i] <= n)
			if(init[i] != inputSeq[i])
				return 0;
	return 1;
}

int replacement(int n, int inputSeq[], int replacementSeq[]) {
	if(!valid(n,inputSeq))
		return 0;
	int maxIdx = -1;
	memset(idx,-1,sizeof(idx));
	for( int i = 0 ; i < n ; i++ ) {
		idx[inputSeq[i]] = i;
		if(maxIdx == -1 || inputSeq[i] > inputSeq[maxIdx])
			maxIdx = i;
	}
	int cnt = 0;
	int curr = init[maxIdx];
	int maxVal = inputSeq[maxIdx];
	for( int i = n+1 ; i <= maxVal ; i++ ) {
		if(idx[i] == -1 || i == maxVal) {
			replacementSeq[cnt++] = curr;
			curr = i;
		}
		else
			replacementSeq[cnt++] = init[idx[i]];
	}
	return cnt;
}

LL calcPow(LL x , int y) {
	if(y == 0)
		return 1;
	LL val = calcPow(x,y/2);
	val = (val*val) % mod;
	if(y & 1)
		val = (val*x) % mod;
	return val;
}

int countReplacement(int n, int inputSeq[]) {
	if(!valid(n,inputSeq))
		return 0;
	sort(inputSeq,inputSeq+n);
	int last = n;
	LL ans = 1;
	for( int i = 0 ; i < n ; i++ )
		if(inputSeq[i] > last) {
			int diff = inputSeq[i]-last-1;
			int base = n-i;
			last = inputSeq[i];
			LL mult = calcPow(base,diff);
			ans = (ans*mult) % mod;
		}
	if(inputSeq[0] > n)
		ans = (ans*n) % mod;
	return (int) ans;
}

/*
int main() {
	int n = 2;
	int inputSeq[n] = {3,4};
	int res = countReplacement(n,inputSeq);
	printf("res = %d\n",res);
	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...