# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1064643 | NemanjaSo2005 | Gondola (IOI14_gondola) | C++17 | 52 ms | 6792 KiB |
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 ll long long
#define f first
#define s second
using namespace std;
const int maxn=1e5+5;
int N,niz[maxn],niz2[maxn];
ll res=0;
const ll MOD=1e9+9;
set<int> S;
void adjust(){
int najm=1;
for(int i=1;i<=N;i++)
if(niz[i]<niz[najm])
najm=i;
for(int i=1;i<=N;i++){
if(i+najm-1<=N)
niz2[i]=niz[i+najm-1];
else
niz2[i]=niz[i+najm-N-1];
}
for(int i=1;i<=N;i++)
niz[i]=niz2[i];
}
int valid(int n, int inputSeq[]){
N=n;
for(int i=1;i<=N;i++){
niz[i]=inputSeq[i-1];
}
for(int i=1;i<=N;i++){
if(S.find(niz[i])!=S.end())
return 0;
S.insert(niz[i]);
}
S.clear();
adjust();/*
for(int i=1;i<=N;i++)
cout<<niz[i]<<" ";
cout<<endl;*/
if(niz[1]>=N)
return 1;
int treba=niz[1];
for(int i=2;i<=N;i++){
treba++;
if(niz[i]>N)
continue;
if(niz[i]!=treba)
return 0;
}
return 1;
}
vector<pair<int,int>> V;
void makepairs(){
int treba=niz[1];
if(treba>N)
treba=1;
for(int i=1;i<=N;i++){
V.push_back({niz[i],treba});
treba++;
if(treba>N)
treba=1;
}
sort(V.begin(),V.end());
}
int replacement(int n, int gondolaSeq[], int replacementSeq[]){
N=n;
for(int i=1;i<=N;i++)
niz[i]=gondolaSeq[i-1];
adjust();
makepairs();
int sled=N+1;
vector<int> R;
for(auto x:V){
while(sled<=x.first){
R.push_back(x.second);
x.second=sled;
sled++;
}
}
for(int i=0;i<R.size();i++)
replacementSeq[i]=R[i];
return R.size();
}
ll stepen(ll a,ll koji){
ll ret=1;
for(int i=1;i<=koji;i<<=1){
if(koji&i)
ret=ret*a%MOD;
a=a*a%MOD;
}
return ret;
}
int countReplacement(int n, int inputSeq[]){
if(valid(n,inputSeq)==0)
return 0;
/* for(int i=0;i<=100;i++)
cout<<i<<": "<<stepen(3,i)<<endl;*/
makepairs();
int losih=0;
for(int i=1;i<=N;i++)
if(niz[i]>N)
losih++;
V.push_back({N,N});
sort(V.begin(),V.end());
res=1;
for(int i=1;i<V.size();i++){
if(V[i].f<=N)
continue;
res=res*stepen(losih,V[i].f-V[i-1].f-1)%MOD;
// cout<<"MNOZI "<<losih<<" "<<V[i].f-V[i-1].f-1<<"\n";
losih--;
}
if(niz[1]>N)
res=res*N%MOD;
return res;
}
Compilation message (stderr)
# | 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... |