제출 #1264869

#제출 시각아이디문제언어결과실행 시간메모리
1264869ortsac곤돌라 (IOI14_gondola)C++17
45 / 100
28 ms12356 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); } //---------------------- 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, so now 1 is at position 0, 2 at 1, etc set<int> waiting; array<int, 250001> p; for (int i = 0; i < 250001; i++) p[i] = -1; // ok now calc for (int i = 0; i < n; i++) p[v[i]] = i; for (int i = 0; i < n; i++) if (v[i] > n) waiting.insert(i); deque<int> curr(n); for (int i = 0; i < n; i++) curr[i] = (i + 1); vector<int> rep; int mx = *max_element(v.begin(), v.end()); for (int i = (n + 1); i <= mx; i++) { if (p[i] == -1) { rep.push_back(curr[*waiting.begin()]); curr[*waiting.begin()] = i; continue; } rep.push_back(curr[p[i]]); curr[p[i]] = i; waiting.erase(i); } //if (curr != v) cout << "noo\n"; 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); 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 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, so now 1 is at position 0, 2 at 1, etc int waiting = 0; array<int, (((int) 1e6) + 10)> p; // ok now calc for (int i = 0; i < n; i++) p[v[i]] = 1; for (int i = 0; i < n; i++) if (v[i] > n) waiting++; int mx = *max_element(v.begin(), v.end()); int ans = 1; for (int i = n + 1; i <= mx; i++) { if (p[i] == 0) { ans = ((ans * waiting)%MOD); continue; } waiting--; } 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...