Submission #753113

#TimeUsernameProblemLanguageResultExecution timeMemory
753113adrilenGondola (IOI14_gondola)C++17
60 / 100
18 ms2368 KiB
#include "gondola.h" #include<bits/stdc++.h> using namespace std; using ll = long long; typedef pair<int, int> pii; constexpr int max_sub_1 = 2.5e5 + 5; bool seen_sub_1[max_sub_1] = { 0 }; int valid(int n, int inputSeq[]) { auto it = min_element(inputSeq, inputSeq + n); int val = *it, pos = it - inputSeq; int start_pos = pos; while (pos != start_pos || val == *it) { if (inputSeq[pos] == val) { val++, pos++; if (pos >= n) pos -= n; val = min(val, n); continue; } if (inputSeq[pos] > n) { if (seen_sub_1[inputSeq[pos]]) return 0; seen_sub_1[inputSeq[pos]] = true; val++, pos++; if (pos >= n) pos -= n; val = min(val, n); continue; } return 0; } return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int min_val, min_pos; auto min_it = min_element(gondolaSeq, gondolaSeq + n); min_val = *min_it, min_pos = min_it - gondolaSeq; vector <pii> numbers; int val = min_val, pos = min_pos; if (val > n) val = 1; int replacement_pos = 0; bool start = true; while (pos != min_pos || start) { start = false; if (gondolaSeq[pos] == val) { pos++, val++; if (pos >= n) pos -= n; if (val > n) val -= n; continue; } if (gondolaSeq[pos] > n) { numbers.emplace_back(pii(gondolaSeq[pos], val)); pos++, val++; if (pos >= n) pos -= n; if (val > n) val -= n; continue; } abort(); } if (numbers.empty()) return 0; sort(numbers.begin(), numbers.end()); int last_val = n; for (const pii &p : numbers) { replacementSeq[replacement_pos++] = p.second; last_val++; while (last_val < p.first) replacementSeq[replacement_pos++] = last_val++; } return replacement_pos; } constexpr ll mod = 1e9 + 7, max_exp = 1e5 + 5, bits_max_exp = 31 - __builtin_clz(max_exp); void modf(ll &num) { if (num >= mod) num %= mod; } ll binary_exp(ll base, ll exp) { ll output = 1; for (int i = 0; i < bits_max_exp; i++) { if (exp & (1 << i)) { output *= base; modf(output); } base *= base; modf(base); } return output; } int countReplacement(int n, int inputSeq[]) { int validity = valid(n, inputSeq); if (validity == 0) return 0; int max_el = *max_element(inputSeq, inputSeq + n); if (max_el == n) return 1; int min_val, min_pos; auto min_it = min_element(inputSeq, inputSeq + n); min_val = *min_it, min_pos = min_it - inputSeq; vector <ll> numbers; int val = min_val, pos = min_pos; if (val > n) val = 1; int replacement_pos = 0; bool start = true; while (pos != min_pos || start) { start = false; if (inputSeq[pos] == val) { pos++, val++; if (pos >= n) pos -= n; if (val > n) val -= n; continue; } if (inputSeq[pos] > n) { numbers.emplace_back(inputSeq[pos]); pos++, val++; if (pos >= n) pos -= n; if (val > n) val -= n; continue; } abort(); } if (numbers.empty()) return 0; sort(numbers.begin(), numbers.end(), greater<ll>()); ll last_val = n, next_val; ll output = 1; for (size_t i = numbers.size(); i > 0; i--) { next_val = numbers.back(); numbers.pop_back(); output *= binary_exp(i, next_val - last_val - 1); modf(output); last_val = next_val; } return (int)output; }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:146:9: warning: unused variable 'replacement_pos' [-Wunused-variable]
  146 |     int replacement_pos = 0;
      |         ^~~~~~~~~~~~~~~
#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...