제출 #308469

#제출 시각아이디문제언어결과실행 시간메모리
308469tengiz05곤돌라 (IOI14_gondola)C++17
90 / 100
32 ms4436 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N];
int cnt[N*3];
int valid(int n, int inputSeq[]){
	for(int i=0;i<n;i++)a[i] = inputSeq[i];
	int i;
	for(i=0;i<n;i++)cnt[a[i]]++;
	for(i=0;i<N*3;i++)if(cnt[i] > 1)return 0;
	for(i=0;i<n;i++){
		if(a[i] < n)break;
	}if(i == n)return 1;
	int now = a[i];
	for(int j=0;j<n;j++){
		if(a[i] <= n && a[i] != now)return 0;
		now++;
		if(now > n)now = 1;
		i++;
		i%=n;
	}
	return 1;
}

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

bool Fixed[N];
int b[N];
int expect[N*3];
int replacement(int n, int gondolaSeq[], int replacementSeq[]){
	set<int> not_fixed;
	for(int i=0;i<N*3;i++)expect[i] = -1;
	for(int i=0;i<n;i++)a[i] = gondolaSeq[i];
	int idx = n;
	for(int i=0;i<n;i++){
		if(a[i] <= n){idx = i; break;}
	}if(idx != n){
		int now = a[idx];
		for(int j=0;j<n;j++){
			b[idx] = now;
			idx++;
			idx %= n;
			now++;
			if(now == n+1)now = 1;
		}
	}else {
		for(int i=0;i<n;i++)b[i] = i+1;
	}
	for(int i=0;i<n;i++){
		if(a[i] <= n)Fixed[i] = true;
		else {
			not_fixed.insert(i);
			expect[a[i]] = i;
		}
	}
	vector<int> ans;
	int now = n+1;
	while(not_fixed.size() > 0){
		if(expect[now] == -1){
			ans.push_back(b[*not_fixed.begin()]);
			b[*not_fixed.begin()] = now;
		}else {
			ans.push_back(b[expect[now]]);
			b[expect[now]] = n;
			not_fixed.erase(expect[now]);
		}now++;
	}
	for(int i=0;i<ans.size();i++){
		replacementSeq[i] = ans[i];
	}
	return (int)ans.size();
}
/*

4
7
2 3 4 9 6 7 1

*/

//----------------------
const long long mod = 1e9+9;
long long binpow(long long a, long long b){
	if(b == 0)return 1ll;
	long long temp = binpow(a, b/2ll);
	temp = (1ll*temp*temp)%mod;
	if(b%2==1)temp *= a;
	return temp%mod;
}
int countReplacement(int n, int inputSeq[]){
	if(valid(n, inputSeq) == false)return 0;
	for(int i=0;i<n;i++){
		a[i] = inputSeq[i];
	}vector<int> v;
	for(int i=0;i<n;i++){
		if(a[i] > n)v.push_back(i);
	}sort(a, a+n);
	if(v.size() == 0)return 1;
	long long last = n;
	long long ans = 1;
	if(v.size() == n)ans *= n;
	for(int i=0;i<n;i++){
		if(a[i] <= n)continue;
		long long dist = a[i]-last-1ll;
		ans *= binpow((long long)n-i, dist);
		ans %= mod;
		last = a[i];
	}
	ans %= mod;
	return ans;
}

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

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:69:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |  for(int i=0;i<ans.size();i++){
      |              ~^~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:102:14: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  102 |  if(v.size() == n)ans *= n;
      |     ~~~~~~~~~^~~~
#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...