Submission #38730

#TimeUsernameProblemLanguageResultExecution timeMemory
3873014kgGondola (IOI14_gondola)C++11
100 / 100
183 ms12168 KiB
#include "gondola.h" #include <map> #include <set> #include <algorithm> #define N 100001 #define MOD 1000000009 using namespace std; int n, g_num, replace_num[N]; int d_len, d[N]; long long count_tot = 1, multi[100], multi_num[100]; map<int, int> valid_w; set<int> check; bool valid_check(int x) { set<int>::iterator it = check.lower_bound(x); if (it == check.end() || *it != x) return false; return true; } int valid(int _n, int in[]) { bool g_check = false; n = _n; for (int i = 0; i < n; i++) { if (g_check) { g_num = g_num == n ? 1 : g_num + 1; } if (valid_check(in[i])) return 0; valid_w[in[i]] = i, check.insert(in[i]); if (in[i] <= n) { if (g_check && g_num != in[i]) return 0; else if (!g_check) { g_check = true, g_num = in[i]; } } } return 1; } int replacement(int _n, int in[], int out[]) { int out_len = 0, w, k = _n + 1; valid(_n, in); for (int i = 0; i < n; i++) { g_num = g_num == n ? 1 : g_num + 1; replace_num[i] = g_num; } for (int i = 0; i < n; i++) { w = replace_num[i]; while (k <= in[i]) { if (valid_w[k] && valid_w[k] != i) { out[out_len++] = replace_num[valid_w[k]]; k++; } else { out[out_len++] = w; w = k++; } } } return out_len; } long long f(long long x, long long turn) { int k = 1; long long res = 1; multi[0] = 1, multi_num[0] = 0; multi[1] = x, multi_num[1] = 1; while (multi_num[k] < turn) { k++; multi[k] = (multi[k - 1] * multi[k - 1]) % MOD; multi_num[k] = multi_num[k - 1] * 2; } for(int i=k; i>=1; i--) if (turn >= multi_num[i]) { turn -= multi_num[i]; res = (res*multi[i]) % MOD; } return res; } int countReplacement(int _n, int in[]) { if (!valid(_n, in)) return 0; for (int i = 0; i < n; i++) { g_num = g_num == n ? 1 : g_num + 1; replace_num[i] = g_num; if (in[i] > n) d[++d_len] = in[i]; } if (d_len == n) count_tot = (long long)n; sort(d + 1, d + d_len + 1); int k = n + 1; for (int i = 1; i <= d_len; i++) { count_tot *= f(d_len - i + 1, d[i] - k); count_tot %= MOD, k = d[i] + 1; } return count_tot; }
#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...