Submission #718218

#TimeUsernameProblemLanguageResultExecution timeMemory
718218thimote75Gondola (IOI14_gondola)C++14
100 / 100
88 ms5932 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; int valid(int n, int inputSeq[]) { set<int> omega; for (int i = 0; i < n; i ++) omega.insert(inputSeq[i]); if (omega.size() != n) return 0; int jStart = -1; for (int i = 0; i < n; i ++) { if (inputSeq[i] > n) continue ; jStart = i; break; } if (jStart == -1) return 1; int start = jStart - inputSeq[jStart] + 1; if (start < 0) start += n; for (int mu = 0; mu < n; mu ++) { int nu = (start + mu); if (nu >= n) nu -= n; if (inputSeq[nu] > n) continue ; if (inputSeq[nu] != mu + 1) return 0; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int maxValue = 0; int maxPos = -1; int jStart = -1; for (int i = 0; i < n; i ++) { if (gondolaSeq[i] > maxValue) { maxValue = gondolaSeq[i]; maxPos = i; } if (gondolaSeq[i] <= n) { jStart = i; } } int start = 0; if (jStart != -1) { start = jStart - gondolaSeq[jStart] + 1; if (start < 0) start += n; } int length = maxValue - n; for (int i = 0; i < length; i ++) { replacementSeq[i] = -1; } for (int i = 0; i < n; i ++) { if (gondolaSeq[i] > n && gondolaSeq[i] != maxValue) { replacementSeq[gondolaSeq[i] - n - 1] = (n + i - start) % n + 1; } } int last = (n + maxPos - start) % n + 1; for (int i = 0; i < length; i ++) { int value = i + n + 1; if (replacementSeq[i] != -1) continue ; replacementSeq[i] = last; last = value; } return length; } //---------------------- #define num long long const num MOD = 1e9 + 9; num h_table[20]; num pw (num x, int k) { h_table[0] = x; for (int h = 1; (1 << h) <= k; h ++) { h_table[h] = h_table[h - 1] * h_table[h - 1]; h_table[h] %= MOD; } num res = 1; for (int i = 0; (1 << i) <= k; i ++) { if (((1 << i) & k) == 0) continue ; res *= h_table[i]; res %= MOD; } return res; } int countReplacement(int n, int inputSeq[]) { if (!valid(n, inputSeq)) return 0; bool includes_old = false; for (int i = 0; i < n; i ++) if (inputSeq[i] <= n) includes_old = true; int maxValue = 0; set<int> omega; for (int i = 0; i < n; i ++) { if (inputSeq[i] > n) omega.insert(inputSeq[i]); maxValue = max(maxValue, inputSeq[i]); } num result = 1; int delta = 0; int last = n; for (int alpha : omega) { int delta_v = alpha - last - 1; result *= pw(omega.size() - delta, delta_v); result %= MOD; last = alpha; delta ++; } if (!includes_old) { result *= n; result %= MOD; } return (int) result; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:10:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   10 |   if (omega.size() != n) return 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...