This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef pair<ll, ll> ii;
typedef vector<ll> vi;
#include "gondola.h"
const ll MOD = 1e9 + 9;
ll nr(ll x) {
x %= MOD;
x += MOD;
x %= MOD;
return x;
}
ll binpow(ll x, ll y) {
x = nr(x);
ll res = 1;
while (y > 0) {
if (y % 2 == 1)
res = nr(res * x);
x = nr(x * x);
y /= 2;
}
return res;
}
int valid(int N, int inputSeq[]) {
vi a;
for (int i = 0; i < N; i++) {
a.pb(inputSeq[i] - 1);
}
int fpos = -1; // fixed position
int fval = -1; // fixed val at position
for (int i = 0; i < N; i++) {
if (a[i] < N) {
fpos = i;
fval = a[i];
}
}
vi b;
if (fval > fpos) {
int s = fval - fpos;
for (int i = N - s; i < N; i++) {
b.pb(a[i]);
}
for (int i = 0; i < N - s; i++) {
b.pb(a[i]);
}
}
else {
int s = fpos - fval;
for (int i = s; i < N; i++) {
b.pb(a[i]);
}
for (int i = 0; i < s; i++) {
b.pb(a[i]);
}
}
for (int i = 0; i < N; i++) {
if (b[i] < N) {
if (b[i] != i)
return 0;
}
}
// all values must be diff
set<int> allv;
for (int x : b)
allv.insert(x);
if (allv.size() != N)
return 0;
return 1;
}
int replacement(int N, int gondolaSeq[], int replacementSeq[]) {
vi a;
for (int i = 0; i < N; i++) {
a.pb(gondolaSeq[i] - 1);
}
int fpos = -1; // fixed position
int fval = -1; // fixed val at position
for (int i = 0; i < N; i++) {
if (a[i] < N) {
fpos = i;
fval = a[i];
}
}
vi b;
if (fpos == -1) {
b = a;
}
else if (fval > fpos) {
int s = fval - fpos;
for (int i = N - s; i < N; i++) {
b.pb(a[i]);
}
for (int i = 0; i < N - s; i++) {
b.pb(a[i]);
}
}
else {
int s = fpos - fval;
for (int i = s; i < N; i++) {
b.pb(a[i]);
}
for (int i = 0; i < s; i++) {
b.pb(a[i]);
}
}
/* cout<<"b: ";
for (int x : b)
cout<<x<<" ";
cout<<endl;*/
// replace 0, 1, ..., N - 1 with b
vector<ii> rep;
for (int i = 0; i < N; i++) {
if (b[i] != i)
rep.pb({b[i], i});
}
sort(rep.begin(), rep.end());
/* cout<<"rep: ";
for (ii p : rep)
cout<<"("<<p.fi<<", "<<p.se<<"); ";
cout<<endl;*/
if (rep.size() == 0) { // just 0 to N - 1
return 0;
}
int curr = N - 1;
vi ans;
for (int i = 0; i < rep.size(); i++) {
ans.pb(rep[i].se);
for (int j = curr + 1; j < rep[i].fi; j++) {
ans.pb(j);
}
curr = rep[i].fi;
}
int K = ans.size();
for (int i = 0; i < K; i++) {
replacementSeq[i] = ans[i] + 1;
}
return K;
}
int countReplacement(int N, int inputSeq[]) {
if (!valid(N, inputSeq))
return 0;
vi a;
for (int i = 0; i < N; i++) {
a.pb(inputSeq[i] - 1);
}
vi pr; // those over N - 1
for (int i = 0; i < N; i++) {
if (a[i] > N - 1)
pr.pb(a[i]);
}
pr.pb(N - 1);
sort(pr.begin(), pr.end());
/* cout<<"pr: ";
for (int x : pr)
cout<<x<<" ";
cout<<endl;*/
int K = pr.size();
ll ans = 1;
for (int i = 0; i < K - 1; i++) {
ll diff = pr[i + 1] - pr[i] - 1;
ans = nr(ans * binpow(K - i - 1, diff));
}
if (K == N + 1)
ans = nr(ans * N);
return (int)(ans);
}
Compilation message (stderr)
gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:78:18: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
78 | if (allv.size() != N)
| ~~~~~~~~~~~~^~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:138:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
138 | for (int i = 0; i < rep.size(); i++) {
| ~~^~~~~~~~~~~~
# | 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... |