제출 #298002

#제출 시각아이디문제언어결과실행 시간메모리
298002Plurm곤돌라 (IOI14_gondola)C++11
100 / 100
70 ms6456 KiB
#include "gondola.h"
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
bool flag = false;
int valid(int n, int inputSeq[])
{
	int offs = 0;
	for(int i = 0; i < n; i++){
		if(inputSeq[i] <= n) offs = (n+i-inputSeq[i]+1) % n;
	}
	for(int i = 0; i < n; i++){
		if(flag){
			if(inputSeq[(i+offs) % n] <= n && inputSeq[(i+offs) % n] != i+1) return 0;
		}else{
			if(inputSeq[(i+offs) % n] != i+1) return 0;
		}
	}
	return 1;
}

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

int expect[250005];
int initSeq[100005];
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	int offs = 0;
	int dummy = 0;
	int mx = -1;
	memset(expect, -1, sizeof(expect));
	for(int i = 0; i < n; i++){
		if(gondolaSeq[i] <= n) offs = (n+i-gondolaSeq[i]+1) % n;
		else expect[gondolaSeq[i]] = i;
		if(gondolaSeq[i] > mx){
			mx = gondolaSeq[i];
			dummy = i;
		}
	}
	for(int i = 0; i < n; i++){
		initSeq[(i+offs) % n] = i+1;
	}
	int rpidx = 0;
	for(int i = n+1; i <= mx; i++){
		if(expect[i] == -1){
			replacementSeq[rpidx++] = initSeq[dummy];
			initSeq[dummy] = i;
		}else{
			replacementSeq[rpidx++] = initSeq[expect[i]];
			initSeq[expect[i]] = i;
		}
	}
	return rpidx;
}

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

const int MOD = 1e9+9;
int upow(int b, int e){
	if(e == 0) return 1;
	int r = upow(b, e/2);
	r = 1ll * r * r % MOD;
	if(e % 2 == 1) r = 1ll * r * b % MOD;
	return r;
}
int countReplacement(int n, int inputSeq[])
{
	flag = true;
	if(!valid(n, inputSeq)) return 0;
	flag = false;
	int offs = -1;
	int dummy = 0;
	int mx = -1;
	int dcnt = 0;
	map<int,int> expect;
	for(int i = 0; i < n; i++){
		if(inputSeq[i] <= n) offs = (n+i-inputSeq[i]+1) % n;
		else expect[inputSeq[i]] = i;
		if(inputSeq[i] > mx){
			mx = inputSeq[i];
			dummy = i;
		}
	}
	int ans = offs == -1 ? n : 1;
	if(offs == -1) offs = 0;
	for(int i = 0; i < n; i++){
		initSeq[(i+offs) % n] = i+1;
	}
	for(int i = 0; i < n; i++){
		if(initSeq[i] == inputSeq[i]) dcnt++;
	}
	int last = n;
	for(auto p : expect){
		ans = 1ll * ans * upow(n-dcnt, p.first - 1 - last) % MOD;
		dcnt++;
		last = p.first;
	}
	return ans;
}

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

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