제출 #582251

#제출 시각아이디문제언어결과실행 시간메모리
582251Josia곤돌라 (IOI14_gondola)C++14
100 / 100
46 ms5324 KiB
#include <bits/stdc++.h> #include "gondola.h" using namespace std; const int mod = 1e9+9; int valid(int n, int inputSeq[]) { deque<int> a(n); deque<int> perm(n); for (int i = 0; i<n; i++) { perm[i] = i; a[i] = inputSeq[i]-1; } for (int i=0; i<=n; i++) { if (a==perm) return 1; perm.push_back(perm[0]); perm.pop_front(); } return 0; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int start = -1; for (int i = 0; i<n; i++) { gondolaSeq[i]--; if (gondolaSeq[i] < n) { if (start == -1) start = (n+i-gondolaSeq[i])%n; assert(start == (n+i-gondolaSeq[i])%n); } } if (start == -1) start = 0; set<pair<int, int>> replacements; set<int> okToReplace; for (int i = start; i<n+start; i++) { if (gondolaSeq[i%n] != i-start) { replacements.insert({gondolaSeq[i%n], i-start}); okToReplace.insert(i-start); } } int curr = n; map<int, int> dict; for (int i: okToReplace) { dict[i]=i; } while (replacements.size()) { assert((*replacements.begin()).first >= curr); assert(okToReplace.size()); if ((*replacements.begin()).first == curr) { replacementSeq[curr-n] = dict[(*replacements.begin()).second]+1; okToReplace.erase((*replacements.begin()).second); replacements.erase(replacements.begin()); } else { replacementSeq[curr-n] = dict[*okToReplace.begin()]+1; dict[*okToReplace.begin()] = curr; } curr++; } return curr-n; } //---------------------- long int fpow(long int b, long int e) { if (e == 0) return 1; long int res = fpow(b, e/2); res *= res; res %= mod; if (e%2 == 1) res *= b; res %= mod; return res; } int countReplacement(int n, int inputSeq[]) { vector<int> seq(n); int start = -1; long int res = 1; for (int i = 0; i<n; i++) { inputSeq[i]--; seq[i] = inputSeq[i]; if (inputSeq[i] < n) { if (start == -1) start = (n+i-inputSeq[i])%n; if(start != (n+i-inputSeq[i])%n) return 0; } } if (start == -1) {start = 0; res = n;} // cerr << "ok\n"; sort(seq.begin(), seq.end()); int last = -1; for (int i: seq) { // cerr << i << " "; if (last == i) return 0; last = i; } // cerr << "\n"; // cerr << "ok\n"; last = n-1; for (int i = 0; i<n; i++) { if (seq[i] <= last) continue; res *= fpow(n-i, seq[i]-last-1); res %= mod; last = seq[i]; } return res; }
#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...