제출 #285671

#제출 시각아이디문제언어결과실행 시간메모리
285671Saboon곤돌라 (IOI14_gondola)C++14
90 / 100
31 ms2276 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int mod = 1e9+9;

bool mark[10*maxn];

int valid(int n, int inputSeq[]){
	for (int i = 0; i < n; i++){
		if (mark[inputSeq[i]])
			return false;
		mark[inputSeq[i]] = 1;
	}
	int idx = min_element(inputSeq, inputSeq+n) - inputSeq;
	if (inputSeq[idx] > n)
		return true;
	int cnt = 0;
	for (int i = idx; i < n; i++){
		if (inputSeq[i] <= n and inputSeq[idx]+cnt != inputSeq[i])
			return false;
		cnt ++;
	}
	for (int i = 0; i < idx; i++){
		if (inputSeq[i] <= n and inputSeq[idx]+cnt != inputSeq[i])
			return false;
		cnt ++;
	}
	return true;
}

int p[maxn];

int replacement(int n, int gondolaSeq[], int replacementSeq[]){
	for (int i = 0; i < n; i++)
		p[i] = i+1;
	for (int i = 0; i < n; i++){
		if (gondolaSeq[i] > n)
			continue;
		int cnt = 0;
		for (int j = i; j < n; j++)
			p[j] = (gondolaSeq[i]+cnt-1)%n+1, cnt++;
		for (int j = 0; j < i; j++)
			p[j] = (gondolaSeq[i]+cnt-1)%n+1, cnt++;
		break;
	}
	vector<pair<int,int>> A;
	for (int i = 0; i < n; i++)
		A.push_back({gondolaSeq[i],i});
	sort(A.begin(),A.end());
	int l = 0, now = n+1;
	for (auto it : A){
		int i = it.second;
		if (gondolaSeq[i] <= n)
			continue;
		while (now <= gondolaSeq[i])
			replacementSeq[l++] = p[i], p[i] = now++;
	}
	return l;
}

int countReplacement(int n, int inputSeq[]){
	if (!valid(n, inputSeq))
		return 0;
	int Z = 1;
	if (*min_element(inputSeq,inputSeq+n) > n)
		Z = n;
	vector<pair<int,int>> A;
	for (int i = 0; i < n; i++)
		if (inputSeq[i] > n)
			A.push_back({inputSeq[i],i});
	sort(A.begin(),A.end());
	int ptr = 0, m = A.size();
	int mx = *max_element(inputSeq,inputSeq+n);
	for (int now = n+1; now <= mx; now++){
		if (A[ptr].first == now){
			ptr ++, m --;
			continue;
		}
		Z = 1LL*Z*m%mod;
	}
	return Z;
}
#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...