Submission #718218

#TimeUsernameProblemLanguageResultExecution timeMemory
718218thimote75Gondola (IOI14_gondola)C++14
100 / 100
88 ms5932 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

int valid(int n, int inputSeq[])
{
  set<int> omega;
  for (int i = 0; i < n; i ++) omega.insert(inputSeq[i]);
  if (omega.size() != n) return 0;

  int jStart = -1;
  for (int i = 0; i < n; i ++) {
    if (inputSeq[i] > n) continue ;

    jStart = i; 
    break;
  }

  if (jStart == -1) return 1;

  int start = jStart - inputSeq[jStart] + 1;
  if (start < 0) start += n;

  for (int mu = 0; mu < n; mu ++) {
    int nu = (start + mu);
    if (nu >= n) nu -= n;

    if (inputSeq[nu] > n) continue ;
    if (inputSeq[nu] != mu + 1)
      return 0;
  }

  return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  int maxValue = 0;
  int maxPos   = -1;

  int jStart = -1;
  for (int i = 0; i < n; i ++) {
    if (gondolaSeq[i] > maxValue) {
      maxValue = gondolaSeq[i];
      maxPos   = i;
    }

    if (gondolaSeq[i] <= n) {
      jStart = i;
    }
  }

  int start = 0;
  if (jStart != -1) {
    start = jStart - gondolaSeq[jStart] + 1;
    if (start < 0) start += n;
  }
  
  int length = maxValue - n;

  for (int i = 0; i < length; i ++) {
    replacementSeq[i] = -1;
  }

  for (int i = 0; i < n; i ++) {
    if (gondolaSeq[i] > n && gondolaSeq[i] != maxValue) {
      replacementSeq[gondolaSeq[i] - n - 1] = (n + i - start) % n + 1;
    }
  }

  int last = (n + maxPos - start) % n + 1;
  for (int i = 0; i < length; i ++) {
    int value = i + n + 1;
    if (replacementSeq[i] != -1) continue ;

    replacementSeq[i] = last;
    last = value;
  }

  return length;
}

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

#define num long long

const num MOD = 1e9 + 9;

num h_table[20];
num pw (num x, int k) {
  h_table[0] = x;
  for (int h = 1; (1 << h) <= k; h ++) {
    h_table[h] = h_table[h - 1] * h_table[h - 1];
    h_table[h] %= MOD;
  }

  num res = 1;
  for (int i = 0; (1 << i) <= k; i ++) {
    if (((1 << i) & k) == 0) continue ;

    res *= h_table[i];
    res %= MOD;
  }

  return res;
}

int countReplacement(int n, int inputSeq[])
{
  if (!valid(n, inputSeq)) return 0;

  bool includes_old = false;
  for (int i = 0; i < n; i ++)
    if (inputSeq[i] <= n)
      includes_old = true;
  
  int maxValue = 0;
  set<int> omega;
  for (int i = 0; i < n; i ++) {
    if (inputSeq[i] > n)
      omega.insert(inputSeq[i]);
    maxValue = max(maxValue, inputSeq[i]);
  }

  num result = 1;
  int delta  = 0;
  int last   = n;
  
  for (int alpha : omega) {
    int delta_v = alpha - last - 1;
    result *= pw(omega.size() - delta, delta_v);
    result %= MOD; 

    last = alpha;
    delta ++;
  }

  if (!includes_old) {
    result *= n;
    result %= MOD;
  }
  return (int) result;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:10:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   10 |   if (omega.size() != n) return 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...