제출 #367430

#제출 시각아이디문제언어결과실행 시간메모리
367430KoDGondola (IOI14_gondola)C++17
100 / 100
61 ms2544 KiB
#include <iostream> #include <numeric> #include <vector> #include <algorithm> #include <utility> #ifndef LOCAL #include "gondola.h" #endif template <class T> using Vec = std::vector<T>; void fix(int n, int seq[]) { for (int i = 0; i < n; ++i) { seq[i] -= 1; } } int valid(int n, int inputSeq[]) { fix(n, inputSeq); Vec<int> rep; for (int i = 0; i < n; ++i) { if (inputSeq[i] >= n) { rep.push_back(inputSeq[i]); } } if (!rep.empty()) { std::sort(rep.begin(), rep.end()); if (std::unique(rep.begin(), rep.end()) != rep.end()) { return 0; } } for (int i = 0; i < n; ++i) { if (inputSeq[i] < n) { for (int j = 0; j < n; ++j) { const auto x = inputSeq[(i + j) % n]; if (x < n && x != (inputSeq[i] + j) % n) { return 0; } } return 1; } } return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { fix(n, gondolaSeq); Vec<int> index(n); std::iota(index.begin(), index.end(), 0); for (int i = 0; i < n; ++i) { if (gondolaSeq[i] < n) { for (int j = 0; j < n; ++j) { index[(i + j) % n] = (gondolaSeq[i] + j) % n; } break; } } Vec<std::pair<int, int>> change; for (int i = 0; i < n; ++i) { if (gondolaSeq[i] >= n) { change.emplace_back(gondolaSeq[i], index[i]); } } std::sort(change.begin(), change.end()); int rep = n; int size = 0; for (const auto [last, first]: change) { replacementSeq[size++] = first + 1; while (rep < last) { replacementSeq[size++] = rep++ + 1; } rep = last + 1; } return size; } using ll = long long; constexpr ll MOD = 1000000009; ll pow(ll x, ll e) { ll ret = 1; while (e > 0) { if (e & 1) { ret = (ret * x) % MOD; } x = (x * x) % MOD; e >>= 1; } return ret; } int countReplacement(int n, int inputSeq[]) { if (!valid(n, inputSeq)) { return 0; } Vec<int> rep; for (int i = 0; i < n; ++i) { if (inputSeq[i] >= n) { rep.push_back(inputSeq[i]); } } std::sort(rep.begin(), rep.end(), std::greater<>()); rep.push_back(n - 1); ll ret = 1; for (int i = 1; i < (int) rep.size(); ++i) { ret = (ret * pow(i, rep[i - 1] - rep[i] - 1)) % MOD; } rep.pop_back(); if ((int) rep.size() == n) { ret = (ret * n) % MOD; } return ret; } #ifdef LOCAL int main() { int n; std::cin >> n; int seq[100] = {}; for (int i = 0; i < n; ++i) { std::cin >> seq[i]; } std::cout << countReplacement(n, seq) << '\n'; return 0; } #endif
#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...