Submission #516111

#TimeUsernameProblemLanguageResultExecution timeMemory
516111sliviuGondola (IOI14_gondola)C++14
100 / 100
57 ms5924 KiB
#include <bits/stdc++.h>
#include <gondola.h>

using namespace std;


int valid(int n, int a[])
{
	map<int, int> mp;
	int index = -1;
	for (int i = 0; i < n; ++i) {
		if (mp.count(a[i]))
			return 0;
		++mp[a[i]];
	}
	for (int i = 0; i < n; ++i)
		if (a[i] <= n) {
			index = i;
			break;
		}
	if (index == -1)
		return 1;
	int cur = a[index];
	cur = cur == n ? 1 : cur + 1;
	for (int j = (index + 1) % n; j != index; j = (j + 1) % n, cur = cur == n ? 1 : cur + 1)
		if (a[j] <= n && a[j] != cur)
			return 0;
	return 1;
}

int replacement(int n, int a[], int ans[]) {
	vector<int> real(n);
	int index = -1, sol = 0, cur;
	for (int i = 0; i < n; ++i)
		if (a[i] <= n) {
			real[i] = a[i];
			index = i;
			break;
		}
	if (index == -1) {
		real[0] = 1;
		index = 0;
	}
	cur = real[index];
	cur = cur == n ? 1 : cur + 1;
	for (int j = (index + 1) % n; j != index; j = (j + 1) % n, cur = cur == n ? 1 : cur + 1)
		real[j] = cur;
	vector<pair<int, int>> b;
	for (int i = 0; i < n; ++i)
		if (a[i] > n)
			b.emplace_back(a[i], i);
	sort(b.begin(), b.end());
	int last = n;
	for (auto [val, idx] : b) {
		ans[sol++] = real[idx];
		for (int i = last + 1; i < val; ++i)
			ans[sol++] = i;
		last = val;
	}
	return sol;
}

int countReplacement(int n, int a[]) {
	if (!valid(n, a))
		return 0;
	const int mod = 1e9 + 9;
	vector<int> real(n);
	int index = -1, cur, sol = 1;
	for (int i = 0; i < n; ++i)
		if (a[i] <= n) {
			real[i] = a[i];
			index = i;
			break;
		}
	if (index == -1) {
		real[0] = 1;
		sol = n;
		index = 0;
	}
	cur = real[index];
	cur = cur == n ? 1 : cur + 1;
	for (int j = (index + 1) % n; j != index; j = (j + 1) % n, cur = cur == n ? 1 : cur + 1)
		real[j] = cur;
	vector<pair<int, int>> b;
	for (int i = 0; i < n; ++i)
		if (a[i] > n)
			b.emplace_back(a[i], i);
	sort(b.begin(), b.end());
	int last = n, cnt = b.size();
	auto pow = [&](int b, int e) {
		if (e < 1)
			return 1;
		int ans = 1;
		while (e) {
			if (e & 1)
				ans = 1LL * ans * b % mod;
			b = 1LL * b * b % mod, e >>= 1;
		}
		return ans;
	};
	for (auto [val, idx] : b) {
		sol = (1LL * sol * pow(cnt--, val - 1 - last)) % mod;
		last = val;
	}
	return sol;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:54:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   54 |  for (auto [val, idx] : b) {
      |            ^
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:101:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  101 |  for (auto [val, idx] : b) {
      |            ^
#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...