Submission #1264875

#TimeUsernameProblemLanguageResultExecution timeMemory
1264875ortsac곤돌라 (IOI14_gondola)C++17
75 / 100
32 ms5444 KiB
#include "gondola.h"
#include <bits/stdc++.h>

using namespace std;

int isValid(int n, deque<int> v) {
  set<int> s;
  for (auto u : v) s.insert(u);
  if (((int) s.size()) < n) return 0;
  int x = *min_element(v.begin(), v.end());
  if (x > n) return 1;
  while (v.front() != x) {
    v.push_front(v.back());
    v.pop_back();
  }
  int curr = x;
  for (int i = 1; i < n; i++) {
    if (v[i] > n) continue;
    if (v[i] != (x + i)) return 0;
  }
  return 1;
}

int valid(int n, int inputSeq[]) {
  deque<int> v(n);
  for (int i = 0; i < n; i++) v[i] = inputSeq[i];
  return isValid(n, v);
}
//----------------------

#define pii pair<int, int>
#define fr first
#define se second

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
  deque<int> v(n);
  for (int i = 0; i < n; i++) v[i] = gondolaSeq[i];
  int po = (min_element(v.begin(), v.end()) - v.begin());
  int x = v[po];
  if (x <= n) {
    int qtd = (x - po - 1)%n;
    qtd = ((qtd + n)%n);
    while (qtd--) {
      v.push_front(v.back());
      v.pop_back();
    }
  }
  // ok now calc
  vector<pii> ord;
  for (int i = 0; i < n; i++) {
    if (v[i] > n) ord.push_back({v[i], i});
  }
  sort(ord.begin(), ord.end());
  vector<int> rep;
  int curr = n;
  for (auto u : ord) {
    int a = (u.se + 1);
    while (curr != u.fr) {
      rep.push_back(a);
      curr++;
      a = curr;
    }
  }
  for (int i = 0; i < ((int) rep.size()); i++) replacementSeq[i] = rep[i];
  return rep.size(); 
}

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

#define int long long

const int MOD = (1e9 + 9);

int mult(int a, int b) {
  return (((a % MOD) * (b % MOD)) % MOD);
}

int binpow(int a, int b) {
  if (b == 0) return 1;
  int c = binpow(a, b/2);
  c = mult(c, c);
  if (b % 2) return mult(a, c);
  else return c;
}

int32_t countReplacement(int32_t n, int32_t inputSeq[]) {
  deque<int32_t> v(n);
  for (int i = 0; i < n; i++) v[i] = inputSeq[i];
  if (!isValid(n, v)) return 0;
  int waiting = 0;
  // ok now calc
  vector<int> over;
  for (int i = 0; i < n; i++) if (v[i] > n) {
    waiting++;
    over.push_back(v[i]);
  }
  sort(over.begin(), over.end());
  int ans = 1;
  int curr = n;
  for (auto u : over) {
    ans = mult(ans, binpow(waiting, u - curr - 1));
    waiting--;
    curr = u;
  }
  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...