Submission #1064344

#TimeUsernameProblemLanguageResultExecution timeMemory
1064344BlagojGondola (IOI14_gondola)C++17
45 / 100
39 ms5676 KiB
#include <bits/stdc++.h>
#include "gondola.h"

using namespace std;

#define ll long long 
#define all(x) (x).begin(), (x).end()

const int MOD = 1000000009;

ll expo(ll base, ll pwr) {
	ll res = 1;
	base %= MOD;
	while (pwr) {
		if (pwr % 2 == 1) res = (res * base) % MOD;
		base = (base * base) % MOD;
		pwr /= 2;
	}
	return res;
}

vector<int> ans;

bool solve(int n, int arr[]) {
	ans.resize(n);
	set<int> s;
	int pos = -1;
	for (int i = 0; i < n; i++) {
		if (s.count(arr[i])) return 0;
		s.insert(arr[i]);
		if (arr[i] <= n) pos = i;
	}
	int val = arr[pos];
	ans[pos] = val;
	for (int i = 0; i < n - 1; i++) {
		pos = (pos + 1) % n;
		val = val % n + 1;
		ans[pos] = val;
		if (arr[pos] < val) return 0;
	}
	return 1;
}

int valid(int n, int inputSeq[]) {
	return solve(n, inputSeq);
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
	solve(n, gondolaSeq);
	int mx = 0;
	for (int i = 0; i < n; i++) mx = max(mx, gondolaSeq[i]);
	int pos[mx + 10];
	for (int i = 0; i <= mx + 5; i++) pos[i] = -1;
	set<int> notCorrect;
	for (int i = 0; i < n; i++) {
		pos[gondolaSeq[i]] = i;
		if (gondolaSeq[i] > n) notCorrect.insert(i);
	}
	int cnt = 0;
	for (int i = n + 1; i <= mx; i++) {
		if (pos[i] == -1) {
			replacementSeq[cnt] = ans[*notCorrect.begin()];
			ans[*notCorrect.begin()] = i;
		}
		else {
			replacementSeq[cnt] = ans[pos[i]];
			ans[pos[i]] = i;
			notCorrect.erase(pos[i]);
		}
		cnt++;
	}
	return cnt;
}

int countReplacement(int n, int inputSeq[]) {
	bool res = solve(n, inputSeq);
	if (res == 0) return 0;
	set<int> notCorrect;
	vector<ll> v;
	for (int i = 0; i < n; i++) {
		if (inputSeq[i] > n) {
			v.push_back(inputSeq[i]);
			notCorrect.insert(i);
		}
	}
	int sz = notCorrect.size();
	v.push_back(n);
	sort(all(v));
	ll cnt = 1;
	for (int i = 1; i < v.size(); i++) {
		ll time = v[i] - v[i - 1] - 1;
		cnt *= expo(sz, time);
		cnt %= MOD;
		sz--;
	}
	return cnt;
}

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:90:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |  for (int i = 1; i < v.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...