#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
int valid(int n, int inputSeq[])
{
unordered_set<int> seen;
for (int i = 0; i < n; ++i)
if (seen.count(inputSeq[i]))
return 0;
else
seen.insert(inputSeq[i]);
int start = -1;
for (int i = 0; i < n; ++i)
if (inputSeq[i] <= n)
{
start = i;
break;
}
if (start != -1)
{
int base = inputSeq[start];
for (int i = 0; i < n; ++i)
{
int expected = (base + i - start) % n;
if (expected <= 0)
expected += n;
if (inputSeq[i] <= n && inputSeq[i] != expected)
return 0;
}
}
return 1;
}
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
int start = 0;
for (int i = 0; i < n; ++i)
if (gondolaSeq[i] <= n)
{
start = i;
break;
}
int base = gondolaSeq[start];
vector<pair<int, int>> chains; // {final replacement number, current replacement number}
for (int i = 0; i < n; ++i)
{
int expected = (base + i - start) % n;
if (expected <= 0)
expected += n;
if (gondolaSeq[i] > n)
chains.push_back({gondolaSeq[i], expected});
}
sort(chains.begin(), chains.end(), greater<pair<int, int>>());
int idx = 0, nextReplacement = n + 1;
while (chains.size() > 1)
{
if (chains.back().first > nextReplacement)
{
replacementSeq[idx++] = chains[0].second;
chains[0].second = nextReplacement;
}
else
{
replacementSeq[idx++] = chains.back().second;
chains.pop_back();
}
++nextReplacement;
}
if (chains.size())
while (nextReplacement <= chains[0].first)
{
replacementSeq[idx++] = chains[0].second;
chains[0].second = nextReplacement++;
}
return idx;
}
const long long MOD = 1e9 + 9;
long long mod_pow(long long a, long long b, long long m = MOD)
{
a %= m;
long long res = 1;
while (b > 0)
{
if (b & 1)
res = res * a % m;
a = a * a % m;
b >>= 1;
}
return res;
}
int countReplacement(int n, int inputSeq[])
{
if (!valid(n, inputSeq))
return 0;
vector<long long> replacements;
for (int i = 0; i < n; ++i)
if (inputSeq[i] > n)
replacements.push_back(inputSeq[i]);
sort(replacements.begin(), replacements.end());
if (replacements.size() < 2)
return 1;
long long ans = 1, prevReplacement = n;
for (int i = 0; i < replacements.size(); ++i)
{
long long repeatedBroken = (replacements[i] - prevReplacement) - 1,
availableSeg = replacements.size() - i;
ans = (ans * mod_pow(availableSeg, repeatedBroken)) % MOD;
prevReplacement = replacements[i];
}
if (replacements.size() == n)
return (ans * n) % MOD;
return ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |