이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "gondola.h"
#include <bits/stdc++.h>
#define pb push_back
#define sz(x) (int)x.size()
#define chmax(x, v) x = max(x, v)
using namespace std;
int valid(int n, int inputSeq[]) {
vector<int> restant;
map<int, bool> vu;
for (int ind = 0; ind < n; ++ind){
if (vu[inputSeq[ind]])
return 0;
vu[inputSeq[ind]] = true;
if (inputSeq[ind] <= n)
restant.pb(ind);
}
for (int ind = 0; ind < sz(restant) - 1; ++ind){
int a = restant[ind] - inputSeq[restant[ind]], b = restant[ind + 1] - inputSeq[restant[ind + 1]];
a += n; a %= n;
b += n; b %= n;
if (a != b)
return 0;
}
return 1;
}
//----------------------
struct Element {
int ind, val;
bool operator < (const Element &autre) const {
return val < autre.val;
}
};
int get(int id, int deb, int n){
if (id > deb)
return id - deb;
else
return n - deb + id;
}
int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
int maxi = 0, deb = 0;
set<Element> reste;
for (int ind = 0; ind < n; ++ind){
chmax(maxi, gondolaSeq[ind]);
if (gondolaSeq[ind] > n){
//cout << "val " << ind << " " << gondolaSeq[ind] << endl;
reste.insert({ind, gondolaSeq[ind]});
}
else
deb = (ind -gondolaSeq[ind] + n)%n;
}
vector<int> actu(n);
for (int i = 0; i < n; ++i)
actu[i] = get(i, deb, n);
for (int tour = n + 1; tour <= maxi; ++tour){
int id = reste.begin()->ind;
replacementSeq[tour - n - 1] = actu[id];
actu[id] = tour;
reste.erase(reste.begin());
if (tour != gondolaSeq[id])
reste.insert({id, tour});
}
return maxi - n;
}
//----------------------
const int MOD = 1e9 + 9;
int countReplacement(int n, int inputSeq[]){
long long nb = 1;
int maxi = 0, deb = 0;
bool entier = true;
priority_queue<int, vector<int>, greater<int>> reste;
for (int ind = 0; ind < n; ++ind){
chmax(maxi, inputSeq[ind]);
if (inputSeq[ind] > n)
reste.push(inputSeq[ind]);
else entier = false;
}
vector<int> actu(n);
for (int i = 0; i < n; ++i)
actu[i] = get(i, deb, n);
for (int tour = n + 1; tour <= maxi; ++tour){
while (!reste.empty() && reste.top() < tour)
reste.pop();
if (reste.top() == tour)
reste.pop();
else{
//cout << "val " << tour << " " << sz(reste) << " " << reste.top() << endl;
nb = (nb * sz(reste))%MOD;
}
}
if (entier)
nb = (nb * n)%MOD;
return (valid(n, inputSeq) * (nb + MOD)%MOD)%MOD;
}
# | 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... |