Submission #332274

#TimeUsernameProblemLanguageResultExecution timeMemory
332274zggfGondola (IOI14_gondola)C++14
100 / 100
45 ms6280 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

int valid(int n, int inputSeq[])
{
	long long offset = -1;
	unordered_map<int, bool> odw;
	for(long long i = 0; i < n; i++){
		if(odw[inputSeq[i]]) return 0;
		odw[inputSeq[i]] = true;
		if(inputSeq[i]<=n){
			long long tmp = (n+inputSeq[i]-i)%n;	
			if(offset==-1) offset = tmp;
			if(tmp!=offset) return 0;
		}	
	}
	return 1;
}

//----------------------

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	long long offset = -1;
	priority_queue<pair<long long, long long>, vector<pair<long long, long long>>, greater<pair<long long, long long>>> q;
	for(long long i = 0; i < n; i++){
		if(gondolaSeq[i]<=n){
			long long tmp = (n+gondolaSeq[i]-i-1)%n;	
			if(offset==-1) offset = tmp;
		}else{
			q.push(make_pair(gondolaSeq[i], i));	
		}	
	}
		
	if(offset==-1) offset=0;
	for(long long i = 0; i < n; i++){
		gondolaSeq[i] = 1+(i+offset)%n;	
	}
	long long cur = n+1;
	for(long long i = 0; !q.empty(); i++){
		if(gondolaSeq[q.top().second] < q.top().first){
			replacementSeq[i] = gondolaSeq[q.top().second];
			gondolaSeq[q.top().second] = cur;	
			cur++;
		}else{
			q.pop();
			i--;	
		}	
	} 
	return cur-n-1;
	return -2;
}

//----------------------

long long mod = 1e9+9;

long long pot(long long a, long long b){
	if(b==0) return 1;
	if(b%2==0){
		long long cur = pot(a, b/2);
		return (cur*cur)%mod;	
	}else return (a*pot(a, b-1))%mod;	
}

int countReplacement(int n, int inputSeq[])
{
	vector<long long> tab;
	long long offset = -1;
	long long wyn = 1;
	long long cnt = 0;
	unordered_map<int, bool> odw;
	for(long long i = 0; i < n; i++){
		if(odw[inputSeq[i]]) return 0;
		odw[inputSeq[i]] = true;
		if(inputSeq[i]<=n){
			long long tmp = (n+inputSeq[i]-i)%n;	
			if(offset==-1) offset = tmp;
			if(tmp!=offset) return 0;
		}else{
			cnt++;
			tab.push_back(inputSeq[i]);	
		}	
	}
	sort(tab.begin(), tab.end());	
	
	long long cur = n+1;
	for(long long i = 0; i < tab.size(); i++){
		wyn*=pot(cnt, tab[i]-cur);	
		wyn%=mod;
		cur=tab[i]+1;
		cnt--;
	}	
	if(offset==-1) wyn*=n;
	wyn%=mod;
	return wyn;
}

Compilation message (stderr)

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