제출 #1264873

#제출 시각아이디문제언어결과실행 시간메모리
1264873ortsac곤돌라 (IOI14_gondola)C++17
45 / 100
25 ms5444 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, 250005> p; for (int i = 0; i < 250005; 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); int mult(int a, int b) { return (((a % MOD) * (b % MOD)) % MOD); } int binpow(int a, int b) { if (b == 0) return 1; int c = binpow(a, b/2); c = mult(c, c); if (b % 2) return mult(a, c); else return c; } 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 waiting = 0; // ok now calc vector<int> over; for (int i = 0; i < n; i++) if (v[i] > n) { waiting++; over.push_back(v[i]); } sort(over.begin(), over.end()); int ans = 1; int curr = n; for (auto u : over) { ans = mult(ans, binpow(waiting, u - curr - 1)); waiting--; curr = u; } 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...