Submission #1220630

#TimeUsernameProblemLanguageResultExecution timeMemory
1220630kunzaZa183Gondola (IOI14_gondola)C++20
100 / 100
42 ms6088 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;

int valid(int n, int inputSeq[]) {
  map<int, int> mii;
  for (int i = 0; i < n; i++)
    mii[inputSeq[i]]++;

  for (auto a : mii)
    if (a.second >= 2)
      return 0;

  int in = min_element(inputSeq, inputSeq + n) - inputSeq;

  vector<int> rep(n, -1);

  if (inputSeq[in] <= n) {
    int cur = inputSeq[in];
    for (int i = in; i < n; i++) {
      if (inputSeq[i] > n)
        rep[cur] = inputSeq[i];
      else if (cur != inputSeq[i])
        return 0;

      cur++;
      if (cur == n + 1)
        cur -= n;
    }

    for (int i = 0; i < in; i++) {
      if (inputSeq[i] > n)
        rep[cur] = inputSeq[i];
      else if (cur != inputSeq[i])
        return 0;

      cur++;
      if (cur == n + 1)
        cur -= n;
    }
  } else {
    for (int i = 0; i < n; i++)
      rep[i] = inputSeq[i];
  }

  return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
  int in = min_element(gondolaSeq, gondolaSeq + n) - gondolaSeq;

  vector<int> rep(n, -1);

  if (gondolaSeq[in] <= n) {
    int cur = gondolaSeq[in];
    for (int i = in; i < n; i++) {
      if (gondolaSeq[i] > n)
        rep[cur] = gondolaSeq[i];
      cur++;
      cur %= n;
    }

    for (int i = 0; i < in; i++) {
      if (gondolaSeq[i] > n)
        rep[cur] = gondolaSeq[i];
      cur++;
      cur %= n;
    }
  } else {
    for (int i = 0; i < n; i++)
      rep[i] = gondolaSeq[i];
  }

  vector<pair<int, int>> vpii;
  for (int i = 0; i < n; i++) {
    if (rep[i] != -1)
      vpii.emplace_back(rep[i], i == 0 ? n : i);
  }

  // for (auto a : rep)
  //   cout << a << " ";
  // cout << "\n";

  sort(vpii.begin(), vpii.end());
  // for (auto a : vpii)
  //   cout << a.first << " " << a.second << "\n";
  int cur = n + 1;

  int len = 0;

  for (auto a : vpii) {
    replacementSeq[len++] = a.second;
    for (int i = cur; i < a.first; i++)
      replacementSeq[len++] = i;

    cur = a.first + 1;
  }

  return len;
}

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

const int MOD = 1e9 + 9;
long long logpow(int a, int b) {
  if (b == 0)
    return 1;
  if (b == 1)
    return a;
  long long x = logpow(a, b / 2);
  if (b % 2 == 1)
    return x * x % MOD * a % MOD;
  return x * x % MOD;
}

int countReplacement(int n, int inputSeq[]) {
  map<int, int> mii;
  for (int i = 0; i < n; i++)
    mii[inputSeq[i]]++;

  for (auto a : mii)
    if (a.second >= 2)
      return 0;

  int in = min_element(inputSeq, inputSeq + n) - inputSeq;

  vector<int> rep(n, -1);

  long long ans = 1;
  if (inputSeq[in] <= n) {
    int cur = inputSeq[in];
    for (int i = in; i < n; i++) {
      if (inputSeq[i] > n)
        rep[cur % n] = inputSeq[i];
      else if (cur != inputSeq[i])
        return 0;

      cur++;
      if (cur == n + 1)
        cur -= n;
    }

    for (int i = 0; i < in; i++) {
      if (inputSeq[i] > n)
        rep[cur % n] = inputSeq[i];
      else if (cur != inputSeq[i])
        return 0;

      cur++;
      if (cur == n + 1)
        cur -= n;
    }
  } else {
    ans = n;
    for (int i = 0; i < n; i++)
      rep[i] = inputSeq[i];
  }

  // cout << "Y\n";

  vector<int> vpii;
  for (int i = 0; i < n; i++) {
    if (rep[i] != -1)
      vpii.emplace_back(rep[i]);
  }

  sort(vpii.begin(), vpii.end());

  int cur = n;

  // cout << "X\n";

  // for (auto a : vpii)
  //   cout << a << '\n';

  for (int j = 0; j < vpii.size(); j++) {
    ans *= logpow(vpii.size() - j, vpii[j] - cur - 1);

    ans %= MOD;

    cur = vpii[j];
  }

  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...