Submission #1088602

#TimeUsernameProblemLanguageResultExecution timeMemory
1088602T0p_Gondola (IOI14_gondola)C++14
55 / 100
15 ms2772 KiB
#include "gondola.h" #include <bits/stdc++.h> #define mod 1000000009 using namespace std; int valid(int n, int inputSeq[]) { set<int> st; vector<pair<int, int>> v; for (int i=0 ; i<n ; i++) { if (inputSeq[i] <= n) { v.push_back({ inputSeq[i], i }); } else { if (st.find(inputSeq[i]) != st.end()) { return 0; } st.insert(inputSeq[i]); } } sort(v.begin(), v.end()); int sz_v = v.size(); for (int i=0 ; i<sz_v-1 ; i++) { if (v[i].first == v[i+1].first) { return 0; } if ((v[i].second + v[i+1].first - v[i].first) % n != v[i+1].second) { return 0; } } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int l = 0, start = -1; vector<pair<int, int>> v; for (int i=0 ; i<n ; i++) { if (gondolaSeq[i] <= n) { start = i; break; } } if (start != -1) { int val = gondolaSeq[start] == n ? 1 : gondolaSeq[start] + 1; for (int i=start+1 ; i<n ; i++) { if (gondolaSeq[i] > n) { v.push_back({ val, gondolaSeq[i] }); } val = val == n ? 1 : val + 1; } for (int i=0 ; i<start ; i++) { if (gondolaSeq[i] > n) { v.push_back({ val, gondolaSeq[i] }); } val = val == n ? 1 : val + 1; } } else { for (int i=0 ; i<n ; i++) { v.push_back({ i+1, gondolaSeq[i] }); } } sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b) { return a.second < b.second; }); int next = n + 1; for (pair<int, int> x : v) { int cur = x.first, tar = x.second; while (cur != tar) { replacementSeq[l++] = cur; cur = next++; } } return l; } //---------------------- int mop (int a, int b) { int res = 1; while (b) { if (b&1) { res = (res * a) % mod; } b >>= 1; a = (a * a) % mod; } return res; } int countReplacement(int n, int inputSeq[]) { if (!valid(n, inputSeq)) { return 0; } int start = -1; vector<pair<int, int>> v; for (int i=0 ; i<n ; i++) { if (inputSeq[i] <= n) { start = i; break; } } if (start != -1) { int val = inputSeq[start] == n ? 1 : inputSeq[start] + 1; for (int i=start+1 ; i<n ; i++) { if (inputSeq[i] > n) { v.push_back({ val, inputSeq[i] }); } val = val == n ? 1 : val + 1; } for (int i=0 ; i<start ; i++) { if (inputSeq[i] > n) { v.push_back({ val, inputSeq[i] }); } val = val == n ? 1 : val + 1; } } else { for (int i=0 ; i<n ; i++) { v.push_back({ i+1, inputSeq[i] }); } } sort(v.begin(), v.end(), [](pair<int, int> a, pair<int, int> b) { return a.second < b.second; }); int k = v.size(); int ans = mop(k, v[0].second - n - 1); for (int i=1 ; i<k ; i++) { ans *= mop(k-i, v[i].second - v[i-1].second - 1); ans %= mod; } if (start == -1) { ans *= n; ans %= 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...