Submission #287912

#TimeUsernameProblemLanguageResultExecution timeMemory
287912shrek12357Gondola (IOI14_gondola)C++14
60 / 100
45 ms4984 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
#include <set>
#include <climits>
#include <cmath>
#include <fstream>
#include <queue>
#include "gondola.h"
using namespace std;

#define MOD 1000000009

int valid(int n, int inputSeq[]) {
	set<int> found;
	for (int i = 0; i < n; i++) {
		found.insert(inputSeq[i]);
	}
	if (found.size() != n) {
		return 0;
	}
	int idx = -1;
	int val = 0;
	for (int i = 0; i < n; i++) {
		if (inputSeq[i] <= n) {
			idx = i;
			val = inputSeq[i];
			break;
		}
	}
	if (idx == -1) {
		return 1;
	}
	int actual[100005];
	actual[idx] = val;
	val++;
	if (val > n) {
		val -= n;
	}
	for (int i = 1; i < n; i++) {
		int cur = (idx + i + n) % n;
		int pre = (idx + i - 1 + n) % n;
		actual[cur] = val;
		val++;
		if (val > n) {
			val -= n;
		}
	}
	for (int i = 0; i < n; i++) {
		if (inputSeq[i] <= n && inputSeq[i] != actual[i]) {
			return 0;
		}
	}
	return 1;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
	int idx = -1, val = 0;
	for (int i = 0; i < n; i++) {
		if (gondolaSeq[i] <= n) {
			idx = i;
			val = gondolaSeq[i];
			break;
		}
	}
	if (idx == -1) {
		idx = 0;
		val = 1;
	}
	int actual[100005];
	actual[idx] = val;
	val++;
	if (val > n) {
		val -= n;
	}
	for (int i = 1; i < n; i++) {
		int cur = (idx + i + n) % n;
		int pre = (idx + i - 1 + n) % n;
		actual[cur] = val;
		val++;
		if (val > n) {
			val -= n;
		}
	}
	set<pair<int, int>> changes;
	for (int i = 0; i < n; i++) {
		if (gondolaSeq[i] > n) {
			changes.insert({ gondolaSeq[i], actual[i]});
		}
	}
	int cur = n + 1;
	vector<int> ans;
	while (changes.size() > 0) {
		if (cur == changes.begin()->first) {
			ans.push_back(changes.begin()->second);
			changes.erase(changes.begin());
		}
		else {
			ans.push_back(changes.begin()->second);
			int temp = changes.begin()->first;
			changes.erase(changes.begin());
			changes.insert({ temp, cur });
		}
		cur++;
	}
	for (int i = 0; i < ans.size(); i++) {
		replacementSeq[i] = ans[i];
		//cout << replacementSeq[i] << endl;
		if (ans[i] == 0) {
			return 5000;
			break;
		}
	}
	return ans.size();
}

int countReplacement(int n, int inputSeq[]) {
	if (!valid(n, inputSeq)) {
		return 0;
	}
	int counter = 0;
	set<int> nums;
	int cur = n + 1;
	for (int i = 0; i < n; i++) {
		if (inputSeq[i] > n) {
			counter++;
			nums.insert(inputSeq[i]);
		}
	}
	if (counter == 0) {
		return 1;
	}
	long long ans = 1;
	while (nums.size() > 0) {
		ans = (ans*(long long)(pow(counter, *nums.begin() - cur)) % MOD) % MOD;
		counter--;
		cur = *nums.begin();
		nums.erase(nums.begin());
	}
	return (int)ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:21:19: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   21 |  if (found.size() != n) {
      |      ~~~~~~~~~~~~~^~~~
gondola.cpp:44:7: warning: unused variable 'pre' [-Wunused-variable]
   44 |   int pre = (idx + i - 1 + n) % n;
      |       ^~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:80:7: warning: unused variable 'pre' [-Wunused-variable]
   80 |   int pre = (idx + i - 1 + n) % n;
      |       ^~~
gondola.cpp:108:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  108 |  for (int i = 0; i < ans.size(); i++) {
      |                  ~~^~~~~~~~~~~~
#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...