Submission #1220623

#TimeUsernameProblemLanguageResultExecution timeMemory
1220623kunzaZa183Gondola (IOI14_gondola)C++20
75 / 100
29 ms4936 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;
}

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

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);

  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 {
    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());

  long long ans = 1;
  const int MOD = 1e9 + 9;

  int cur = n;

  // cout << "X\n";

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

  for (int j = 0; j < vpii.size(); j++) {
    int times = vpii[j] - cur;
    for (int i = 0; i < times - 1; i++) {
      // cout << vpii.size() - j << "\n";
      ans *= vpii.size() - j;
      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...