Submission #136582

#TimeUsernameProblemLanguageResultExecution timeMemory
136582mosesmayerGondola (IOI14_gondola)C++17
100 / 100
39 ms3588 KiB
#include "gondola.h" #include <bits/stdc++.h> #define fi first #define se second #define pb push_back #define eb emplace_back #define ALL(x) x.begin(), x.end() using namespace std; typedef long long LL; typedef vector<int> vi; typedef pair<int,int> pii; int valid(int n, int inputSeq[]){ vi a(inputSeq, inputSeq + n); // handle whether all values are unique vi b(a.begin(), a.end()); sort(ALL(b)); b.erase(unique(ALL(b)), b.end()); if (b.size() != a.size()) return 0; // handle min element vi::iterator mnit = min_element(a.begin(), a.end()); int mn = *mnit, pos = mnit - a.begin(); if (mn >= n) return 1; // rotate elements so that min is at first position. // now index i will be original position of (mn + i - 1)%n + 1; rotate(a.begin(), a.begin() + pos, a.end()); // validity check for (int i = 0; i < n; i++){ if (a[i] > n) continue; if (a[i] != ((mn + i - 1) % n + 1)) return 0; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]){ vi a(gondolaSeq, gondolaSeq + n); // get length int len = (*max_element(a.begin(), a.end())) - n; vi::iterator mnit = min_element(a.begin(), a.end()); int mn = *mnit, pos = mnit - a.begin(); if (mn < n){ rotate(a.begin(), a.begin() + pos, a.end()); } else { pos = 0; } vector<pii> rep; // to be replaced for (int i = 0; i < n; i++){ int oriNum = mn < n ? ((mn + i - 1) % n) + 1 : i+1; if (a[i] > n || a[i] != oriNum){ rep.eb(a[i], oriNum); } } sort(rep.begin(), rep.end()); int cur = n+1, idx = 0; for (int i = 0; i < rep.size(); i++){ int prv = rep[i].se; while (cur <= rep[i].fi){ replacementSeq[idx++] = prv; prv = cur; cur++; } } return len; } //---------------------- const LL mod = 1e9 + 9; LL fpow(LL b, LL e, LL m = mod){ LL r = 1; for (; e > 0; e >>= 1){ if (e&1) (r *= b) %= m; (b *= b) %= m; } return r; } int countReplacement(int n, int inputSeq[]){ if (!valid(n, inputSeq)) return 0; vi a(inputSeq, inputSeq + n); vi::iterator mnit = min_element(a.begin(), a.end()); int mn = *mnit, pos = mnit - a.begin(); rotate(a.begin(), a.begin() + pos, a.end()); vector<pii> rep; LL tot = 1; int cur = n; for (int i = 0; i < n; i++){ int oriNum = (mn + i - 1) % n + 1; if (a[i] != oriNum) rep.eb(a[i], oriNum); else cur--; } sort(rep.begin(), rep.end()); int prv = n; for (pii p : rep){ (tot *= fpow(cur, p.fi - prv - 1)) %= mod; cur--; prv = p.fi; } if (mn > n){ (tot *= n) %= mod; } return tot; }

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:61:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < rep.size(); i++){
                  ~~^~~~~~~~~~~~
#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...