Submission #118073

#TimeUsernameProblemLanguageResultExecution timeMemory
118073dragonslayeritGondola (IOI14_gondola)C++14
90 / 100
290 ms262144 KiB
#include "gondola.h"
#include <set>
#include <vector>
#include <algorithm>
#include <cstdio>

const int MOD=1e9+9;

int valid(int n, int inputSeq[])
{
  int shift=-1;
  std::set<int> used;
  for(int i=0;i<n;i++){
    if(used.count(inputSeq[i])) return 0;
    used.insert(inputSeq[i]);
    if(inputSeq[i]<=n){
      int new_shift=(inputSeq[i]-i+n)%n;
      if(shift!=-1&&shift!=new_shift) return 0;
      shift=new_shift;
    }
  }
  return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  for(int i=0;i<n;i++){
    gondolaSeq[i]--;
  }
  int shift=0;
  for(int i=0;i<n;i++){
    if(gondolaSeq[i]<n){
      shift=(gondolaSeq[i]-i+n)%n;
      break;
    }
  }
  std::vector<int> seq(n);
  for(int i=0;i<n;i++){
    seq[i]=(i+shift)%n;
  }
  auto max=std::max_element(gondolaSeq,gondolaSeq+n);
  std::vector<int> where(*max+1,max-gondolaSeq);
  for(int i=0;i<n;i++){
    where[gondolaSeq[i]]=i;
  }
  for(int x=n;x<=*max;x++){
    replacementSeq[x-n]=seq[where[x]];
    seq[where[x]]=x;
  }
  int l=*max+1-n;
  for(int i=0;i<l;i++){
    replacementSeq[i]++;
  }
  return l;
}

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

int countReplacement(int n, int inputSeq[])
{
  if(!valid(n,inputSeq)) return 0;
  for(int i=0;i<n;i++){
    inputSeq[i]--;
  }
  int shift=-1;
  for(int i=0;i<n;i++){
    if(inputSeq[i]<n){
      shift=(inputSeq[i]-i+n)%n;
      break;
    }
  }
  std::vector<int> seq(n);
  for(int i=0;i<n;i++){
    seq[i]=(i+shift+n)%n;
  }
  auto max=std::max_element(inputSeq,inputSeq+n);
  std::vector<int> where(*max+1,max-inputSeq);
  for(int i=0;i<n;i++){
    where[inputSeq[i]]=i;
  }
  int cnt=(shift==-1)?n:1;
  int spots=n;
  for(int x=0;x<=*max;x++){
    if(x==inputSeq[where[x]]){
      spots--;
    }else if(x>=n){
      cnt=1LL*cnt*spots%MOD;
    }
    seq[where[x]]=x;
  }
  return cnt;
}
#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...