제출 #208237

#제출 시각아이디문제언어결과실행 시간메모리
208237Sorting곤돌라 (IOI14_gondola)C++14
60 / 100
27 ms2148 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

bool check_valid_pair(int lvalue, int rvalue, int n){
	if(lvalue <= 0 || rvalue <= 0)
		return false;
	if(lvalue > n || rvalue > n)
		return true;
	if((lvalue + 1) % n != rvalue % n)
		return false;
	return true;
}

int valid(int n, int inputSeq[]){
	if(n == 1)
		return true;

	for(int i = 0; i < n - 1; ++i)
		if(!check_valid_pair(inputSeq[i], inputSeq[i + 1], n))
			return false;

	if(!check_valid_pair(inputSeq[n - 1], inputSeq[0], n))
		return false;

	sort(inputSeq, inputSeq + n);
	for(int i = 0; i < n - 1; ++i)
		if(inputSeq[i] == inputSeq[i + 1])
			return false;

	return true;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]){
	int start = 0;
	for(int i = 0; i < n; ++i){
		if(gondolaSeq[i] <= n){
			start = i + 1 - gondolaSeq[i];
			if(start < 0)
				start += n;
			break;
		}
	}

	vector<pair<int, int>> v(n);
	for(int i = 0; i < n; ++i)
		v[i] = {gondolaSeq[i], i};
	sort(v.begin(), v.end());

	int cnt_replacement = 0, new_n = n;
	for(int i = 0; i < n; ++i){
		int idx;
		if(v[i].second >= start)
			idx = v[i].second + 1 - start;
		else
			idx = n + v[i].second + 1 - start;

		if(v[i].first > n){
			replacementSeq[cnt_replacement++] = idx;
			++new_n;
			while(v[i].first != new_n){
				replacementSeq[cnt_replacement++] = new_n;
				++new_n;
			}
		}
	}

	return cnt_replacement;
}

const long long mod = 1e9 + 7;

int countReplacement(int n, int inputSeq[]){
	if(!valid(n, inputSeq))
		return 0;

	int start = 0;
	bool start_exists = false;
	for(int i = 0; i < n; ++i){
		if(inputSeq[i] <= n){
			start = i + 1 - inputSeq[i];
			if(start < 0)
				start += n;
			start_exists = true;
			break;
		}
	}

	int cnt_changed = 0;
	for(int i = 0; i < n; ++i)
		if(inputSeq[i] > n)
			++cnt_changed;

	vector<pair<int, int>> v(n);
	for(int i = 0; i < n; ++i)
		v[i] = {inputSeq[i], i};
	sort(v.begin(), v.end());

	int new_n = n;
	long long ans = 1;
	for(int i = 0; i < n; ++i){
		int idx;
		if(v[i].second >= start)
			idx = v[i].second + 1 - start;
		else
			idx = n + v[i].second + 1 - start;

		if(v[i].first > n){
			++new_n;
			while(v[i].first != new_n){
				ans *= cnt_changed;
				ans %= mod;
				++new_n;
			}
			--cnt_changed;
		}
	}

	if(!start_exists){
		ans *= n;
		ans %= mod;
	}

	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:103:7: warning: variable 'idx' set but not used [-Wunused-but-set-variable]
   int idx;
       ^~~
#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...