Submission #50295

#TimeUsernameProblemLanguageResultExecution timeMemory
50295faishol27곤돌라 (IOI14_gondola)C++14
100 / 100
104 ms17284 KiB
#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;

typedef long long ll;
typedef pair<int, int> pi;

#define fi first
#define se second
#define PUB push_back

set<int>ada;

int valid(int n, int inputSeq[])
{	
	int isValid;
	int ind_min;

	ada.clear();

	isValid = 1; ind_min = 0;

	for(int i=0;i<n;i++){
		if(inputSeq[i] < inputSeq[ind_min]) ind_min = i;
		if(ada.find(inputSeq[i]) != ada.end()){
			isValid = 0;
		}

		ada.insert(inputSeq[i]);
	}
	
	int str = ind_min,
		fin = ind_min-1,
		cnt = inputSeq[ind_min];

	if(fin<0) fin = n-1;
	//cerr << str << " " << fin << " " << cnt << endl;
	while(str != fin){
		if(inputSeq[str] <= n && inputSeq[str] != cnt){
			isValid = 0;
			break;
		}

		str++; cnt++;
		if(str>=n) str = 0;
	}
	
	return isValid;
}

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

bool cmp1(pi a, pi b){
	return a.fi < b.fi;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	int ret=0,
		ind=0,
		tmp=0,
		cnt_chg=n+1,
		cnt = 1,
		nmr = 0;

	vector<pi>data;

	for(int i=0;i<n;i++){
		if(gondolaSeq[i] < gondolaSeq[ind]) ind = i;	
	}

	if(gondolaSeq[ind] <= n){
		ind = ind-gondolaSeq[ind]+1;
		if(ind < 0) ind += n;
	}
	
	while(cnt <= n){
		if(gondolaSeq[ind]>n) data.PUB({gondolaSeq[ind],cnt});
		
		ind++; cnt++;
		if(ind>=n) ind = 0;
	}

	sort(data.begin(), data.end(), cmp1);

	for(int i=0;i<data.size();i++){
		while(data[i].se != data[i].fi){
			replacementSeq[nmr] = data[i].se;
			
			data[i].se = cnt_chg;

			cnt_chg++;
			nmr++;
		}
	}

	ret = nmr;
	return ret;
}

//----------------------
const int MOD = 1e9+9;
int modexp(int bwh, int pgk){
	ll 	b = bwh,
		e = pgk;

	ll r = 1;
	while(e>0){
		if(e&1) r = r*b%MOD;

		e>>=1;
		b = b*b%MOD;
	}
	
	r %= MOD;

	return (int) r;
}

int countReplacement(int n, int inputSeq[])
{
	ll ret=1;
	int cnt=n+1;
	vector<int>data;

	if(valid(n,inputSeq)==0) return 0;

	for(int i=0;i<n;i++){
		if(inputSeq[i] > n) data.PUB(inputSeq[i]);
	}

	sort(data.begin(), data.end());

	if(data.size()==n) ret *= n;

	for(int i=0;i<data.size();i++){
		//cerr << (data.size()-i) <<" " << (data[i]-cnt) << " " << modexp((data.size()-i),(data[i]-cnt),MOD) << endl; 
		//cerr << i << " " << ret << endl;
		
		if(data[i]-cnt > 0)
			ret = ret*modexp((data.size()-i),(data[i]-cnt))%MOD;
	
		cnt = data[i]+1;
	}

	ret %= MOD;
	
	return (int) ret;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:86:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<data.size();i++){
              ~^~~~~~~~~~~~
gondola.cpp:61:3: warning: unused variable 'tmp' [-Wunused-variable]
   tmp=0,
   ^~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:134:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(data.size()==n) ret *= n;
     ~~~~~~~~~~~^~~
gondola.cpp:136:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<data.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...