제출 #579907

#제출 시각아이디문제언어결과실행 시간메모리
5799071ne곤돌라 (IOI14_gondola)C++14
60 / 100
51 ms9988 KiB
#include<bits/stdc++.h>
using namespace std;
#include "gondola.h"

int valid(int n, int inputSeq[])
{
	int index = -1;
  for (int i = 0;i<n;++i){
	if (inputSeq[i] <=n){
		index = i;
	}
  }
  map<int,int>visited;
  if (index == -1){
	for (int i = 0;i<n;++i){
		int x = inputSeq[i];
		if (visited[x])return 0;
		visited[x] = true;
	}
	return 1;
  }
  for (int i = 0;i<n;++i){
	int j = (i + index)%n;
	int temp = inputSeq[index] + i;
	if (temp > n)temp = temp % n;
	if (visited[temp] || visited[inputSeq[j]])return 0;
	visited[temp] = true;
	visited[inputSeq[j]] = true;
  }
  return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  int index = -1;
  	int maxxy = 1;
  for (int i = 0;i<n;++i){
	if (gondolaSeq[i] <=n){
		index = i;
	}
	maxxy = max(gondolaSeq[i],maxxy);
  }
  map<int,int>visited;
  int init = 1;
  if (index == -1){
	  index = 0;
  }
  else init = gondolaSeq[index];
  int extra = n + 1;
  for (int i = 0;i<n;++i){
	visited[gondolaSeq[i]] = i + 1;
  }
  int cur = 0;
  for (int i = 0;i<n;){
	int j = (i + index)%n;
	int temp = init + i;
	if (temp > n)temp = temp % n;
	if (gondolaSeq[j] == temp){
		++i;
		continue;
	}
	if (gondolaSeq[j] < extra){
		++i;
		continue;
	}
	vector<int>pos;
	while(!visited[extra]){
		pos.push_back(extra);
		extra++;
	}
	if (visited[extra] && extra!=gondolaSeq[j]){
		int temp2 = visited[extra] - index - 1;
		if (temp2 <= 0)temp2+=n;
		temp2 = init + temp2;
		if (temp2 > n)temp2 = temp2 % n;
		replacementSeq[cur++] = temp2;
		for (auto x:pos){
			replacementSeq[cur++] = x;
		}
		extra++;
	}
	else{
		replacementSeq[cur++] = temp;
		for (auto x:pos){
			replacementSeq[cur++] = x;
		}
		extra++;
		++i;
	}
  }
  return cur;
}

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

int countReplacement(int n, int inputSeq[])
{
	if (!valid(n,inputSeq))return 0;
	int index = -1;
  for (int i = 0;i<n;++i){
	if (inputSeq[i] <=n){
		index = i;
	}
  }
  map<int,int>visited;
  const int mod = 1e9 + 9;
  long long ans = 1;
  int init = 1;
  bool ok = false;
  if (index == -1){
	  ok = true;
	  index = 0;
  }
  for (int i = 0;i<n;++i){
	visited[inputSeq[i]] = i + 1;
  }
  int extra = n + 1;
  vector<int>gondola;
  for (int i = 0;i<n;++i)gondola.push_back(inputSeq[i]);
  sort(gondola.begin(),gondola.end());
  int time = 0;
  vector<long long>arr(4 * n,0),pref(4 * n + 1,0);
  vector<pair<long long,long long>>brr;
  for (int i = 0;i<n;){
	time++;
	int j = (i + index)%n;
	int temp = init + i;
	if (temp > n)temp = temp % n;
	if (inputSeq[j] == temp){
		++i;
		continue;
	}
	if (inputSeq[j] < extra){
		++i;
		continue;
	}
	long long counts = 0;
	if(!visited[extra]){
		int p = upper_bound(gondola.begin(),gondola.end(),extra) - gondola.begin();
		counts = gondola[p] - extra;
		extra = gondola[p];
		brr.push_back({time,counts});
	}
	if (visited[extra] && extra!=inputSeq[j]){
		int temp2 = visited[extra] - index - 1;
		if (temp2 <= 0)temp2+=n;
		temp2 = init + temp2;
		if (temp2 > n)temp2 = temp2 % n;
		arr[time]++;
		extra++;
	}
	else{
		arr[time]++;
		extra++;
		++i;
	}
  }
  assert(time < 4 * n);
  for (int i = 0;i<4 * n;++i){
	pref[i + 1] = (pref[i] + arr[i])%mod;
  }
  for (auto x:brr){
	long long temp = (pref[4 * n] - pref[x.first] + mod)%mod;
	ans = (ans * max(1LL,temp * x.second)%mod)%mod;
  }
  if (ok)ans = (ans * n)%mod;
  return ans;
}
#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...