Submission #1005826

#TimeUsernameProblemLanguageResultExecution timeMemory
1005826GrayGondola (IOI14_gondola)C++17
100 / 100
47 ms8272 KiB
#include<bits/stdc++.h> #include "gondola.h" #define ll long long #define ff first #define ss second #define ln "\n" using namespace std; const ll MOD = 1e9+9; int valid(int n, int inputSeq[]) { vector<ll> sn(n); ll trunk=-1; map<ll, ll> usd; for (ll i=0; i<n; i++){ if (usd[inputSeq[i]]) return 0; usd[inputSeq[i]]=1; if (inputSeq[i]<=n) { sn[i]=inputSeq[i]; trunk=i; } } if (trunk==-1) return 1; ll init = inputSeq[trunk]-1; for (ll i=trunk-1; i>=0; i--){ sn[i]=(--init+n)%n+1; } init=inputSeq[trunk]-1; for (ll i=trunk+1; i<n; i++){ sn[i]=(++init)%n+1; } for (ll i=0; i<n; i++){ if (inputSeq[i]<=n and inputSeq[i]!=sn[i]) return 0; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { vector<ll> sn(n); ll trunk=-1; for (ll i=0; i<n; i++){ if (gondolaSeq[i]<=n) { sn[i]=gondolaSeq[i]; trunk=i; } } ll init = gondolaSeq[trunk]-1; for (ll i=trunk-1; i>=0; i--){ sn[i]=(--init+n)%n+1; } init=gondolaSeq[trunk]-1; for (ll i=trunk+1; i<n; i++){ sn[i]=(++init)%n+1; } vector<pair<ll, ll>> rep; for (ll i=0; i<n; i++){ if (gondolaSeq[i]>n){ rep.push_back({gondolaSeq[i], sn[i]}); } } sort(rep.begin(), rep.end()); ll len=0, prev=n, last; for (ll i=0; i<(ll)rep.size(); i++){ // cout << rep[i].ff << " " << rep[i].ss << ln; last=rep[i].ss; while (prev<rep[i].ff){ replacementSeq[len]=last; len++; last=++prev; } } return len; } //---------------------- ll binpow(ll a, ll b){ if (b==0) return 1; ll res=binpow(a, b/2); res=res*res%MOD; if (b&1) res=res*a%MOD; return res; } int countReplacement(int n, int inputSeq[]) { if (!valid(n, inputSeq)) return 0; vector<ll> sn(n); ll trunk=-1; for (ll i=0; i<n; i++){ if (inputSeq[i]<=n) { sn[i]=inputSeq[i]; trunk=i; } } if (trunk==-1){ for (ll i=0; i<n; i++){ sn[i]=i+1; } }else{ ll init = inputSeq[trunk]-1; for (ll i=trunk-1; i>=0; i--){ sn[i]=(--init+n)%n+1; } init=inputSeq[trunk]-1; for (ll i=trunk+1; i<n; i++){ sn[i]=(++init)%n+1; } } vector<pair<ll, ll>> rep; for (ll i=0; i<n; i++){ if (inputSeq[i]>n){ rep.push_back({inputSeq[i], sn[i]}); } } sort(rep.begin(), rep.end()); ll prev=n; ll ans=1; for (ll i=0; i<(ll)rep.size(); i++){ ans=ans*binpow(rep.size()-i, rep[i].ff-prev-1)%MOD; // cout << "H: " << rep.size()-i << "^" << rep[i].ff-prev-1 << "->" << binpow(rep.size()-i, rep[i].ff-prev-1) << ln; prev=rep[i].ff; } if (trunk==-1){ ans=ans*n%MOD; } return 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...