제출 #1220621

#제출 시각아이디문제언어결과실행 시간메모리
1220621kunzaZa183곤돌라 (IOI14_gondola)C++20
60 / 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] = 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];
  }

  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 ans = 1;
  const int MOD = 1e9 + 9;

  int cur = n;

  for (auto a : vpii) {
    ans *= (cur - a);
    ans %= MOD;

    cur = a;
  }

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