Submission #38730

#TimeUsernameProblemLanguageResultExecution timeMemory
3873014kgGondola (IOI14_gondola)C++11
100 / 100
183 ms12168 KiB
#include "gondola.h"
#include <map>
#include <set>
#include <algorithm>
#define N 100001
#define MOD 1000000009

using namespace std;
int n, g_num, replace_num[N];
int d_len, d[N];
long long count_tot = 1, multi[100], multi_num[100];
map<int, int> valid_w;
set<int> check;

bool valid_check(int x) {
	set<int>::iterator it = check.lower_bound(x);

	if (it == check.end() || *it != x) return false;
	return true;
}
int valid(int _n, int in[]) {
	bool g_check = false;

	n = _n;
	for (int i = 0; i < n; i++) {
		if (g_check) {
			g_num = g_num == n ? 1 : g_num + 1;
		}
		if (valid_check(in[i])) return 0;
		valid_w[in[i]] = i, check.insert(in[i]);

		if (in[i] <= n) {
			if (g_check && g_num != in[i]) return 0;
			else if (!g_check) {
				g_check = true, g_num = in[i];
			}
		}
	} return 1;
}

int replacement(int _n, int in[], int out[]) {
	int out_len = 0, w, k = _n + 1;

	valid(_n, in);
	for (int i = 0; i < n; i++) {
		g_num = g_num == n ? 1 : g_num + 1;
		replace_num[i] = g_num;
	}
	for (int i = 0; i < n; i++) {
		w = replace_num[i];
		while (k <= in[i]) {
			if (valid_w[k] && valid_w[k] != i) {
				out[out_len++] = replace_num[valid_w[k]];
				k++;
			}
			else {
				out[out_len++] = w;
				w = k++;
			}
		}
	} return out_len;
}

long long f(long long x, long long turn) {
	int k = 1;
	long long res = 1;

	multi[0] = 1, multi_num[0] = 0;
	multi[1] = x, multi_num[1] = 1;
	while (multi_num[k] < turn) {
		k++;
		multi[k] = (multi[k - 1] * multi[k - 1]) % MOD;
		multi_num[k] = multi_num[k - 1] * 2;
	}

	for(int i=k; i>=1; i--)
		if (turn >= multi_num[i]) {
			turn -= multi_num[i];
			res = (res*multi[i]) % MOD;
		}
	return res;
}
int countReplacement(int _n, int in[]) {
	if (!valid(_n, in)) return 0;

	for (int i = 0; i < n; i++) {
		g_num = g_num == n ? 1 : g_num + 1;
		replace_num[i] = g_num;
		if (in[i] > n) d[++d_len] = in[i];
	}
	if (d_len == n) count_tot = (long long)n;

	sort(d + 1, d + d_len + 1);

	int k = n + 1;
	for (int i = 1; i <= d_len; i++) {
		count_tot *= f(d_len - i + 1, d[i] - k);
		count_tot %= MOD, k = d[i] + 1;
	} return count_tot;
}
#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...