Submission #809014

#TimeUsernameProblemLanguageResultExecution timeMemory
809014KerimGondola (IOI14_gondola)C++17
100 / 100
54 ms6024 KiB
#include "gondola.h" #include "bits/stdc++.h" #define ll long long using namespace std; bool is_unique(int n, int arr[]){ set<int> s; for (int i = 0; i < n; i++){ if (s.count(arr[i])) return false; s.insert(arr[i]); } return true; } vector<int> beginning(int n, int pos, int value){ vector<int> arr(n); for (int i = 0; i < n; i++){ arr[pos] = value+1; pos = (pos+1)%n; value = (value+1)%n; } return arr; } int valid(int n, int arr[]){ if (!is_unique(n, arr)) return false; int pos = -1; for (int i = 0; i < n; i++) if (arr[i] <= n) pos = i; if (pos == -1) return 1; vector<int> original = beginning(n, pos, arr[pos]-1); for (int i = 0; i < n; i++) if (arr[i] <= n and arr[i] != original[i]) return 0; return 1; } //---------------------- int replacement(int n, int arr[], int answer[]){ assert(valid(n, arr)); int max_value = 0, pos = -1; int min_value = INT_MAX; for (int i = 0; i < n; i++){ max_value = max(max_value, arr[i]); min_value = min(min_value, arr[i]); if (arr[i] <= n) pos = i; } if (max_value <= n) return 0; vector<int> original(n); for (int i = 0; i < n; i++) original[i] = i+1; if (min_value <= n) original = beginning(n, pos, arr[pos]-1); vector<int> idx; for (int i = 0; i < n; i++) if (arr[i] > n) idx.push_back(i); sort(idx.begin(), idx.end(), [&](int x, int y){ return (arr[x] < arr[y]); }); int position = 0, last = n+1; for (int i = 0; i < int(idx.size()); i++){ answer[position++] = original[idx[i]]; while (last < arr[idx[i]]) answer[position++] = last++; last += 1; } return position; } //---------------------- const int MOD = 1e9+9; int mod(ll x){ return (x%MOD); } int Fe(int x, int y){ if(!y) return 1; int h = Fe(x, y/2); h = mod(h*1LL*h); if (y&1) h = mod(h*1LL*x); return h; } int countReplacement(int n, int arr[]){ if (!valid(n, arr)) return 0; vector<int> idx; for (int i = 0; i < n; i++) if (arr[i] > n) idx.push_back(i); sort(idx.begin(), idx.end(), [&](int x, int y){ return (arr[x] < arr[y]); }); int free_n = int(idx.size()), ans = 1, last = n; if (free_n == n) ans = n; for (int i = 0; i < int(idx.size()); i++){ int cur = arr[idx[i]]; ans = mod(ans * 1LL * Fe(free_n, cur - last - 1)); last = cur; free_n -= 1; } 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...