제출 #222742

#제출 시각아이디문제언어결과실행 시간메모리
222742staniewzki곤돌라 (IOI14_gondola)C++17
75 / 100
24 ms2272 KiB
#include<bits/stdc++.h> using namespace std; #define REP(i, n) for(int i = 0; i < n; i++) #define FOR(i, a, b) for(int i = a; i <= b; i++) #define ST first #define ND second ostream& operator<<(ostream &out, string str) { for(char c : str) out << c; return out; } template<class L, class R> ostream& operator<<(ostream &out, pair<L, R> p) { return out << "(" << p.ST << ", " << p.ND << ")"; } template<class T> auto operator<<(ostream &out, T a) -> decltype(a.begin(), out) { out << "{"; for(auto it = a.begin(); it != a.end(); it = next(it)) out << (it != a.begin() ? ", " : "") << *it; return out << "}"; } void dump() { cerr << "\n"; } template<class T, class... Ts> void dump(T a, Ts... x) { cerr << a << ", "; dump(x...); } #ifdef DEBUG # define debug(...) cerr << "[" #__VA_ARGS__ "]: ", dump(__VA_ARGS__) #else # define debug(...) false #endif template<class T> int size(T && a) { return (int) a.size(); } using LL = long long; using PII = pair<int, int>; #include "gondola.h" int valid(int n, int inputSeq[]) { int origin = -1, mx = -1; REP(i, n) { mx = max(mx, inputSeq[i]); if(inputSeq[i] <= n) { int x = (i - inputSeq[i] + n) % n; if(origin == -1) origin = x; if(origin != x) return false; } } vector<int> used(mx + 1); REP(i, n) { if(used[inputSeq[i]]) return false; used[inputSeq[i]] = true; } return true; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int origin = -1, mx = -1; REP(i, n) { mx = max(mx, gondolaSeq[i]); if(gondolaSeq[i] <= n && origin == -1) origin = (i - gondolaSeq[i] + n) % n; } vector<int> pos(mx + 1, -1); REP(i, n) pos[gondolaSeq[i]] = i; vector<int> Q; int cur = 0; FOR(i, n + 1, mx) { Q.emplace_back(i); if(pos[i] != -1) { int last = (pos[i] - origin + n) % n; if(last == 0) last = n; for(int x : Q) { replacementSeq[cur++] = last; last = x; } Q.clear(); } } return cur; } //---------------------- int countReplacement(int n, int inputSeq[]) { int origin = -1; REP(i, n) { if(inputSeq[i] <= n) { int x = (i - inputSeq[i] + n) % n; if(origin == -1) origin = x; if(origin != x) return false; } } vector<int> p = {n}; REP(i, n) { if(inputSeq[i] > n) p.emplace_back(inputSeq[i]); } sort(p.rbegin(), p.rend()); const int mod = 1e9 + 9; int ans = 1, suff = 0; function<int(int, int)> qpow = [&](int a, int x) -> int { if(x == 0) return 1; if(x % 2 == 1) return (LL) qpow(a, x - 1) * a % mod; return qpow((LL) a * a % mod, x / 2); }; REP(i, size(p) - 1) { int len = p[i] - p[i + 1] - 1; if(len == -1) return false; ans = (LL) ans * qpow(++suff, len) % mod; } 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...