Submission #162042

#TimeUsernameProblemLanguageResultExecution timeMemory
162042oolimry곤돌라 (IOI14_gondola)C++14
100 / 100
121 ms6152 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000009;
long long power(long long b, long long p){
	if(p == 0) return 1;
	if(p % 2 == 0){
		long long a = power(b,p/2);
		return (a * a) % mod;
	}
	else{
		return (power(b,p-1) * b) % mod;
	}
}
int valid(int n, int arr[]) {
	set<int> sset;
    for(int i = 0;i < n;i++){
		sset.insert(arr[i]);
	}
	if(sset.size() != n) return 0;
	
	int anchor = -1;
	
	for(int i = 0;i < n;i++){
		if(arr[i] <= n){
			anchor = (arr[i] - i + n) % n;
			break;
		}
	}
	
	if(anchor == -1) return 1;
	
	for(int i = 0;i < n;i++){
		if(arr[i] <= n){
			if(arr[i] % n != (anchor + i) % n){
				return 0;
			}
		}
	}
	return 1;
}

int replacement(int n, int arr[], int replacementSeq[]) {
	
	int anchor = 0;
	int ori[n];
	map<int,int> m;
	set<int> s;
    for(int i = 0;i < n;i++){
		if(arr[i] <= n){
			anchor = (arr[i] - i + n) % n;
			break;
		}
	}
	
	int maxv = 0;
	int maxpos = 0;
	for(int i = 0;i < n;i++){
		ori[i] = (anchor+i) % n;
		if(ori[i] == 0) ori[i] = n;
		if(arr[i] > maxv){
			maxv = arr[i];
			maxpos = i;
		}
		if(arr[i] > n){
			m[arr[i]] = i;
		}
	}
	
	
	int cnt = 0;
	for(int r = n+1;r <= maxv;r++){
		int rindex = 0;
		if(m.find(r) == m.end()){
			rindex = maxpos;
		}
		else{
			rindex = m[r];
		}
		
		replacementSeq[cnt] = ori[rindex];
		ori[rindex] = r;
		cnt++; 
	}
	
	return cnt;
	
}

int countReplacement(int n, int arr[]) {
    if(!valid(n,arr)) return 0;
    long long ans = 1;
    int maxv = 0;
    int freee = n;
    set<int> s;
    bool has = true;
    vector<int> v;
    for(int i = 0;i < n;i++){
		maxv = max(maxv, arr[i]);
		if(arr[i] <= n){
			freee--;
			has = false;
		}
		else{
			v.push_back(arr[i]);
		}
	}
	
	sort(v.begin(),v.end());
	int pre = n;
	for(int x : v){
		long long p = x - pre - 1;
		ans *= power(freee,p);
		ans %= mod;
		pre = x;
		freee--;
	}
	if(has){
		ans *= n;
		ans %= mod;
	}
	return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:20:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(sset.size() != n) 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...