Submission #382702

#TimeUsernameProblemLanguageResultExecution timeMemory
382702TrunktyGondola (IOI14_gondola)C++14
100 / 100
291 ms3184 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include "gondola.h"
using namespace std;
 
int valid(int n, int inputSeq[]){
	vector<int> ck={};
	for(int i=0;i<n;i++){
		ck.push_back(inputSeq[i]);
	}
	sort(ck.begin(),ck.end());
	for(int i=1;i<ck.size();i++){
		if(ck[i]==ck[i-1]){
			return 0;
		}
	}
	int ind=0;
	for(int i=0;i<n;i++){
		if(inputSeq[i]<=n){
			ind = i-(inputSeq[i]-1);
			if(ind<0){
				ind += n;
			}
			break;
		}
	}
	int now = 1;
	for(int i=ind;i<n;i++){
		if(inputSeq[i]<=n){
			if(inputSeq[i]!=now){
				return 0;
			}
		}
		now++;
	}
	for(int i=0;i<ind;i++){
		if(inputSeq[i]<=n){
			if(inputSeq[i]!=now){
				return 0;
			}
		}
		now++;
	}
	return 1;
}
 
int replacement(int n, int gondolaSeq[], int replacementSeq[]){
	int ind=0;
	for(int i=0;i<n;i++){
		if(gondolaSeq[i]<=n){
			ind = i-(gondolaSeq[i]-1);
			if(ind<0){
				ind += n;
			}
			break;
		}
	}
	int have[250005],maxi=-1,pos=0;
	for(int i=1;i<250005;i++){
		have[i] = -1;
	}
	for(int i=0;i<n;i++){
		have[gondolaSeq[i]] = ((i-ind+n)%n)+1;
		if(gondolaSeq[i]>maxi){
			maxi = gondolaSeq[i];
			pos = ((i-ind+n)%n)+1;
		}
	}
	for(int i=n+1;i<maxi;i++){
		if(have[i]==-1){
			replacementSeq[i-n-1] = pos;
			pos = i;
		}
		else{
			replacementSeq[i-n-1] = have[i];
		}
	}
	replacementSeq[maxi-n-1] = pos;
	return maxi-n;
}
long long mod=1000000009;
long long fastpow(long long base, long long exp){
	long long pow2[33];
	pow2[0] = base;
	for(int i=1;i<=32;i++){
		pow2[i] = pow2[i-1]*pow2[i-1];
		pow2[i] = pow2[i]%mod;
	}
	long long ans=1,now=0;
	for(int i=32;i>=0;i--){
		if(now+pow(2,i)<=exp){
			now += pow(2,i);
			ans *= pow2[i];
			ans = ans%mod;
		}
	}
	return ans;
}
int countReplacement(int n, int inputSeq[]){
	if(not valid(n,inputSeq)){
		return 0;
	}
	long long ans=1,now=n;
	vector<long long> have={};
	bool allbreak=true;
	for(int i=0;i<n;i++){
		if(inputSeq[i]<=n){
			allbreak = false;
		}
		else{
			have.push_back(inputSeq[i]);
		}
	}
	if(allbreak){
		ans = n;
	}
	sort(have.begin(),have.end());
	for(int i=0;i<have.size();i++){
		ans *= fastpow(have.size()-i,have[i]-now-1);
		ans = ans%mod;
		now = have[i];
	}
	int k = ans;
	return k;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:14:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |  for(int i=1;i<ck.size();i++){
      |              ~^~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:120:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |  for(int i=0;i<have.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...