Submission #230685

#TimeUsernameProblemLanguageResultExecution timeMemory
230685monus1042Gondola (IOI14_gondola)C++17
100 / 100
50 ms6280 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
#define ii pair<int, int>
#define vi vector<int>
#define vii vector<ii>
#define eb emplace_back
#define all(x) x.begin(), x.end()
typedef long long ll;

const ll modu=1e9+9;

int valid(int n, int inputSeq[])
{
	unordered_set<int> ch;
	for (int i=0; i<n; i++){
		ch.insert(inputSeq[i]);
	}
	if ((int)ch.size()==n){
		int fi=1000000, se=1000000;
		for (int i=0; i<n; i++){
			if (1<=inputSeq[i] && inputSeq[i]<=n && inputSeq[i]<fi){
				fi=inputSeq[i];
				se=i;
			}
		}
		if (fi==1000000){
			return 1;
		}else{
			bool check=1;
			for (int i=se, track=fi; i<se+n; i++, track++){
				if (1<=inputSeq[i%n] && inputSeq[i%n]<=n){
					if (inputSeq[i%n] == track){
						
					}else{
						check=0;
						break;
					}
				}
			}
			if (check) return 1;
			return 0;
		}
	}else{
		return 0;
	}
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	vii delta;
	int cnt=0;
	for (int i=0; i<n; i++){
		if (1<=gondolaSeq[i] && gondolaSeq[i]<=n){
			cnt++;
		}
	}
	if (!cnt){
		for (int i=0; i<n; i++){
			delta.eb(ii(gondolaSeq[i], i+1)); //del, #
		}
		sort(all(delta));

		vi ret;
		int curr=n+1;
		for (int i=0; i<n; i++){
			while(1){
				if (curr>delta[i].first) break;
				ret.eb(delta[i].second);
				delta[i].second=curr;
				curr++;
			}
		}
		int si=ret.size();
		for (int i=0; i<si; i++){
			replacementSeq[i]=ret[i];
		}
		return si;
	}else if (cnt==n){
		return 0;
	}else{
		//cout<<"XD\n";
		int mini=1000000, pos=0;
		for (int i=0; i<n; i++){
			if (gondolaSeq[i]<mini){
				mini=gondolaSeq[i];
				pos=i;
			}
		}
		int diff=mini-1;
		pos-=diff;
		pos%=n;
		pos+=n;
		pos%=n;

		//cout<<pos<<endl;
		vi ret;
		for (int i=pos, track=1; i<n+pos; i++, ++track){
			if (gondolaSeq[i%n]>n)
				delta.eb(ii(gondolaSeq[i%n], track));
		}

		sort(all(delta));
		//cout<<delta[0].second<<endl;
		int curr=n+1, dels=delta.size();
		for (int i=0; i<dels; i++){
			while(1){
				if (curr>delta[i].first) break;
				ret.eb(delta[i].second);
				delta[i].second=curr;
				curr++;
			}
		}
		int si=ret.size();
		for (int i=0; i<si; i++){
			replacementSeq[i]=ret[i];
		}
		return si;
	}
}

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

ll supapower(ll b, ll ex){
	if (!ex)
		return 1;
	if (ex&1)
		return (supapower((b*b)%modu, ex/2) * b) % modu;
	return supapower((b*b)%modu, ex/2) % modu;
}

int countReplacement(int n, int inputSeq[])
{
	unordered_set<int> ch;
	for (int i=0; i<n; i++){
		ch.insert(inputSeq[i]);
	}
	bool alldiff=0, fcase=1;
	if ((int)ch.size()==n){
		int fi=1000000, se=1000000;
		for (int i=0; i<n; i++){
			if (1<=inputSeq[i] && inputSeq[i]<=n && inputSeq[i]<fi){
				fi=inputSeq[i];
				se=i;
			}
		}
		if (fi==1000000){
			alldiff=1;
		}else{
			//bool check=1;
			for (int i=se, track=fi; i<se+n; i++, track++){
				if (1<=inputSeq[i%n] && inputSeq[i%n]<=n){
					if (inputSeq[i%n] == track){
						
					}else{
						fcase=0;
						break;
					}
				}
			}
		}
	}else{
		return 0;
	}

	if (fcase == alldiff && !alldiff)
		return 0;

	ll ans=1;
	vi aux;
	for (int i=0; i<n; i++){
		if (inputSeq[i]>n){
			aux.eb(inputSeq[i]);
		}
	}

	int ss=aux.size();
	sort(all(aux));
	for (int i=0; i<ss; i++){
		ll di;
		if (!i){
			di=aux[i]-n-1;
		}else{
			di=aux[i] - aux[i-1] -1;
		}
		if (di>0){
			ans*=supapower((ll)ss-i, (ll)di);
			ans%=modu;
		}
	}
	if (alldiff)
		ans*=(ll)n;

	ans%=modu;
	
	return (int)ans;
}
#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...