이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
// M
#include<bits/stdc++.h>
#include "gondola.h"
using namespace std;
const int N = 300005, Mod = 1e9 + 9;
int n, A[N];
int valid(int _n, int inputSeq[])
{
n = _n;
for (int i = 0; i < n; i ++)
A[i] = inputSeq[i] - 1;
int st = -1;
map < int , int > MP;
for (int i = 0; i < n; i ++)
{
if (MP[A[i]])
return 0;
MP[A[i]] = 1;
if (A[i] < n)
st = i;
}
if (st == -1)
return 1;
for (int i = 0; i < n; i ++)
if (A[i] < n)
{
if (i <= st && (A[i] + st - i) % n != A[st])
return 0;
if (i > st && (A[st] + i - st) % n != A[i])
return 0;
}
return 1;
}
int replacement(int _n, int gondolaSeq[], int replacementSeq[])
{
n = _n;
for (int i = 0; i < n; i ++)
A[i] = gondolaSeq[i] - 1;
int st = -1;
for (int i = 0; i < n; i ++)
if (A[i] < n)
st = (i - A[i] + n) % n;
/*int mx = * max_element(A, A + n);
vector < int > M(mx + 10, 0);
set < pair < int , int > > ST;
for (int i = 0; i < n; i ++)
M[A[i]] = 1, ST.insert({A[i], i});
int unused = mx;
while (ST.size())
{
int i = ST.rbegin()->second;
int val = ST.rbegin()->first;
ST.erase(* ST.rbegin());
assert(A[i] == val);
while (unused >= val || M[unused])
unused --;
if (unused >= n)
{
A[i] = unused;
M[unused] = 1;
ST.insert({A[i], i});
continue;
}
if (st == -1
}*/
vector < int > M(N, -1);
for (int i = 0; i < n; i ++)
M[A[i]] = i;
if (st == -1)
st = 0;
int ptr = N - 1, fre = N - 1;
vector < int > V;
while (ptr >= n)
{
while (M[ptr] == -1 && ptr >= n)
ptr --;
if (ptr < n)
break;
fre = min(fre, ptr - 1);
int nw = M[ptr]; ptr --;
while (M[fre] != -1 && fre >= n)
fre --;
if (fre < n)
{
V.push_back((nw - st + n) % n);
continue;
}
M[fre] = nw;
V.push_back(fre);
}
reverse(V.begin(), V.end());
for (int i = 0; i < (int)V.size(); i ++)
replacementSeq[i] = V[i] + 1;
return ((int)V.size());
}
int Power(int a, int b)
{
int ret = 1;
for (; b; b >>= 1, a = 1LL * a * a % Mod)
if (b & 1) ret = 1LL * ret * a % Mod;
return ret;
}
int countReplacement(int _n, int inputSeq[])
{
n = _n;
for (int i = 0; i < n; i ++)
A[i] = inputSeq[i];
if (!valid(n, A))
return 0;
vector < int > V;
for (int i = 0; i < n; i ++)
V.push_back(A[i]);
sort(V.begin(), V.end());
reverse(V.begin(), V.end());
bool ff = 0;
while ((int)V.size() && (int)V.back() < n)
V.pop_back(), ff = 1;
V.push_back(n - 1);
int tot = 1;
for (int i = 1; i < (int)V.size(); i ++)
tot = 1LL * tot * Power(i, V[i - 1] - V[i] - 1) % Mod;
if (!ff)
tot = 1LL * tot * n % Mod;
return tot;
}
# | 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... |