Submission #67219

#TimeUsernameProblemLanguageResultExecution timeMemory
67219MKopchevGondola (IOI14_gondola)C++14
100 / 100
198 ms10188 KiB
#include<bits/stdc++.h> #include "gondola.h" using namespace std; const int mod=1e9+9; int valid(int n, int inputSeq[]) { set<int> uniq={}; for(int i=0;i<n;i++) uniq.insert(inputSeq[i]); if(uniq.size()!=n)return 0; int mini=0; for(int i=1;i<n;i++) if(inputSeq[mini]>inputSeq[i])mini=i; int ind=(mini+1)%n; int value=-1; int target=inputSeq[mini]; while(ind!=mini) { value=inputSeq[ind]; target++; if(value<target)return 0; if(value<=n&&target<=n) { if(value!=target)return 0; } ind=(ind+1)%n; } return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int mini=0; for(int i=1;i<n;i++) if(gondolaSeq[mini]>gondolaSeq[i])mini=i; map<int/*number you are aiming at*/,int/*where you begin*/> start={}; if(gondolaSeq[mini]>n) { for(int i=0;i<n;i++) start[gondolaSeq[i]]=i+1; } else { int value=gondolaSeq[mini],t=0; for(int i=mini;i!=mini||t==0;i=(i+1)%n) { start[gondolaSeq[i]]=value; value++; if(value>n)value=1; t++; } } int prev=n,ind=0; //for(auto k:start)cout<<k.first<<" "<<k.second<<endl; for(auto k:start) { if(k.first!=k.second) { replacementSeq[ind++]=k.second; prev++; while(prev!=k.first) { replacementSeq[ind++]=prev; prev++; } } prev=max(prev,k.first); } //cout<<ind<<" : ";for(int i=0;i<ind;i++)cout<<replacementSeq[i]<<" ";cout<<endl; return ind; } long long my_pow(long long a,long long b) { if(b==0)return 1; long long c=my_pow(a,b/2); if(b%2==0)return c*c%mod; return c*c%mod*a%mod; } int countReplacement(int n, int inputSeq[]) { if(valid(n,inputSeq)==0)return 0; int mini=0; for(int i=1;i<n;i++) if(inputSeq[mini]>inputSeq[i])mini=i; set<int> integers={}; long long result=1; if(inputSeq[mini]>n) { result=n; for(int i=0;i<n;i++) integers.insert(inputSeq[i]); } else { int value=inputSeq[mini],t=0; for(int i=mini;i!=mini||t==0;i=(i+1)%n) { if(inputSeq[i]!=value)integers.insert(inputSeq[i]); value++; if(value>n)value=1; t++; } } int prev=n,active=integers.size(); for(auto k:integers) { result=result*my_pow(active,k-prev-1)%mod; prev=k; active--; } return result; } /* int n=4; int v[]={1, 2, 7, 6}; int arr[7]; int main() { cout<<countReplacement(n,v)<<endl; } */

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:10:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(uniq.size()!=n)return 0;
        ~~~~~~~~~~~^~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:33:5: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
     for(int i=1;i<n;i++)
     ^~~
gondola.cpp:35:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
         map<int/*number you are aiming at*/,int/*where you begin*/> start={};
         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...