This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "gondola.h"
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define rt insert
#define st first
#define nd second
#define ll long long
#define pii pair < int , int >
#define DB printf("debug\n");
#define umax( x , y ) x = max( x , (y) )
#define umin( x , y ) x = min( x , (y) )
#define all(x) x.begin() , x.end()
#define MOD 1000000009
using namespace std;
int nx(int i,int sz){
return (i+1)%(sz);
}
map < int,int > timesseen;
int origl=-1;
int broken=0;
long long ans=1;
int valid(int n, int inputSeq[])
{
vector < int > orig;
for(int i=0;i<n;i++){
int nxx=nx(i,n);
timesseen[inputSeq[i]]++;
if(timesseen[inputSeq[i]]>1)return 0;
if(inputSeq[i]<=n)orig.pb(inputSeq[i]);
if(inputSeq[i]<=n&&inputSeq[nxx]<=n){
if(inputSeq[i]==n && inputSeq[nxx]!=1)return 0;
else if(inputSeq[i]<n && inputSeq[nxx]!=inputSeq[i]+1)return 0;
}
}
int startover=0;
for(int i=0;i<orig.size();i++){
int nxx=nx(i,orig.size());
if(orig[i]<orig[nxx])continue;
else if(startover==0)startover++;
else if(startover==1)return 0;
}
return 1;
}
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
for(int i=0;i<n;i++){
int nxx=nx(i,n);
if(gondolaSeq[i]<=n){
origl=i-(gondolaSeq[i]-1)+n;
origl%=n;
}
umax(broken,gondolaSeq[i]-n);
}
if(origl==-1){
origl=0;
ans*=n;
ans%=MOD;
}
int repind[broken+5];
set < int > repcand;
int orig[n+5];
for(int i=0;i<n;i++){
int ogon=(i+1)-origl+n;
if(ogon>n)ogon%=n;
orig[i]=ogon;
if(gondolaSeq[i]>n){
repcand.insert(i);
repind[gondolaSeq[i]-n-1]=i;
}
}
for(int i=0;i<broken;i++){
if(!repind[i]){
ans*=repcand.size();ans%=MOD;
replacementSeq[i]=orig[*repcand.begin()];
orig[*repcand.begin()]=i+n+1;
}
else{
replacementSeq[i]=orig[repind[i]];
orig[repind[i]]=i+n+1;
repcand.erase(repcand.find(repind[i]));
}
}
return broken;
}
int replacement2(int n, int gondolaSeq[])
{
for(int i=0;i<n;i++){
int nxx=nx(i,n);
if(gondolaSeq[i]<=n){
origl=i-(gondolaSeq[i]-1)+n;
origl%=n;
}
umax(broken,gondolaSeq[i]-n);
}
if(origl==-1){
origl=0;
ans*=n;
ans%=MOD;
}
int repind[broken];
set < int > repcand;
int orig[n];
for(int i=0;i<n;i++){
int ogon=(i+1)-origl+n;
if(ogon>n)ogon%=n;
orig[i]=ogon;
if(gondolaSeq[i]>n){
repcand.insert(i);
repind[gondolaSeq[i]-n-1]=i;
}
}
for(int i=0;i<broken;i++){
if(!repind[i]){
ans*=repcand.size();ans%=MOD;
orig[*repcand.begin()]=i+n+1;
}
else{
orig[repind[i]]=i+n+1;
repcand.erase(repcand.find(repind[i]));
}
}
return broken;
}
//----------------------
int countReplacement(int n, int inputSeq[])
{
if(valid(n,inputSeq)==0)return 0;
int a=replacement2(n,inputSeq);
if(a==0)return 1;
return ans;
}
Compilation message (stderr)
gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:37:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0;i<orig.size();i++){
^
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:48:7: warning: unused variable 'nxx' [-Wunused-variable]
int nxx=nx(i,n);
^
gondola.cpp: In function 'int replacement2(int, int*)':
gondola.cpp:92:7: warning: unused variable 'nxx' [-Wunused-variable]
int nxx=nx(i,n);
^
gondola.cpp:107:6: warning: variable 'orig' set but not used [-Wunused-but-set-variable]
int orig[n];
^
# | 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... |