Submission #136080

#TimeUsernameProblemLanguageResultExecution timeMemory
136080arthurconmyGondola (IOI14_gondola)C++14
100 / 100
108 ms6648 KiB
#include <bits/stdc++.h> #ifndef ARTHUR_LOCAL #include "gondola.h" #endif using namespace std; using ll = long long; map<int,int> used; const ll p = 1000000009; ll modpow(ll a, ll b) { if(b==0LL) return 1LL; ll cur = modpow(a,ll(b/2LL)); cur*=cur; cur%=p; if(b%2 == 1LL) cur*=a; cur%=p; return cur; } int valid(int n, int S[]) { pair<int,int> minn = {int(1e9),int(1e9)}; for(int i=0; i<n; i++) { if(used[S[i]]==1) return 0; used[S[i]]=1; minn = min(minn, make_pair(S[i],i)); } int cur = minn.first; if(cur>n) return 1; int one_pos = (minn.second - minn.first + 1 + n)%n; for(int j=0; j<n; j++) { if(S[(one_pos+j)%n] == j+1 || S[(one_pos+j)%n]>n) continue; return 0; } return 1; } int replacement(int n, int G[], int R[]) { pair<int,int> minn = {int(1e9),int(1e9)}; for(int i=0; i<n; i++) { minn = min(minn, make_pair(G[i],i)); } int cur = minn.first; int one_pos = (minn.second - minn.first + 1 + n)%n; if(cur>n) one_pos=0; vector<pair<int,int>> reps; for(int j=0; j<n; j++) { if(G[(one_pos+j)%n] == j+1) continue; reps.push_back(make_pair(G[(one_pos+j)%n],j+1)); } sort(reps.begin(),reps.end()); int ans=0; int next_boat=n+1; for(auto rep:reps) { int cur = rep.second; for(int i=next_boat; i<=rep.first; i++) { // cout << cur << endl; R[ans] = cur; cur=next_boat; ans++; next_boat++; } } // cout << endl; return ans; } int countReplacement(int n, int S[]) { pair<int,int> minn = {int(1e9),int(1e9)}; for(int i=0; i<n; i++) { if(used[S[i]]==1) return 0; used[S[i]]=1; minn = min(minn, make_pair(S[i],i)); } int cur = minn.first; int one_pos=-1; bool orientation_lost=0; if(cur>n) { one_pos=0; orientation_lost=1; } else { one_pos = (minn.second - minn.first + 1 + n)%n; orientation_lost=0; } if(cur>n) { one_pos=0; orientation_lost=1; } for(int j=0; j<n; j++) { if(S[(one_pos+j)%n] == j+1 || S[(one_pos+j)%n]>n) continue; return 0; } vector<int> V={0}; for(int j=0; j<n; j++) { if(S[(one_pos+j)%n] == j+1) continue; V.push_back(S[(one_pos+j)%n]-n); } if(V.size()==1) return 1; sort(V.begin(),V.end()); // for(auto v:V) cout << v << endl; ll ans=1; for(int i=1; i<int(V.size()); i++) { ans*=modpow(ll(V.size())-ll(i),ll(V[i]-V[i-1]-1)); ans%=p; } if(orientation_lost) { ans*=n; ans%=p; } return int(ans); }
#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...