Submission #230685

#TimeUsernameProblemLanguageResultExecution timeMemory
230685monus1042Gondola (IOI14_gondola)C++17
100 / 100
50 ms6280 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; #define ii pair<int, int> #define vi vector<int> #define vii vector<ii> #define eb emplace_back #define all(x) x.begin(), x.end() typedef long long ll; const ll modu=1e9+9; int valid(int n, int inputSeq[]) { unordered_set<int> ch; for (int i=0; i<n; i++){ ch.insert(inputSeq[i]); } if ((int)ch.size()==n){ int fi=1000000, se=1000000; for (int i=0; i<n; i++){ if (1<=inputSeq[i] && inputSeq[i]<=n && inputSeq[i]<fi){ fi=inputSeq[i]; se=i; } } if (fi==1000000){ return 1; }else{ bool check=1; for (int i=se, track=fi; i<se+n; i++, track++){ if (1<=inputSeq[i%n] && inputSeq[i%n]<=n){ if (inputSeq[i%n] == track){ }else{ check=0; break; } } } if (check) return 1; return 0; } }else{ return 0; } } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { vii delta; int cnt=0; for (int i=0; i<n; i++){ if (1<=gondolaSeq[i] && gondolaSeq[i]<=n){ cnt++; } } if (!cnt){ for (int i=0; i<n; i++){ delta.eb(ii(gondolaSeq[i], i+1)); //del, # } sort(all(delta)); vi ret; int curr=n+1; for (int i=0; i<n; i++){ while(1){ if (curr>delta[i].first) break; ret.eb(delta[i].second); delta[i].second=curr; curr++; } } int si=ret.size(); for (int i=0; i<si; i++){ replacementSeq[i]=ret[i]; } return si; }else if (cnt==n){ return 0; }else{ //cout<<"XD\n"; int mini=1000000, pos=0; for (int i=0; i<n; i++){ if (gondolaSeq[i]<mini){ mini=gondolaSeq[i]; pos=i; } } int diff=mini-1; pos-=diff; pos%=n; pos+=n; pos%=n; //cout<<pos<<endl; vi ret; for (int i=pos, track=1; i<n+pos; i++, ++track){ if (gondolaSeq[i%n]>n) delta.eb(ii(gondolaSeq[i%n], track)); } sort(all(delta)); //cout<<delta[0].second<<endl; int curr=n+1, dels=delta.size(); for (int i=0; i<dels; i++){ while(1){ if (curr>delta[i].first) break; ret.eb(delta[i].second); delta[i].second=curr; curr++; } } int si=ret.size(); for (int i=0; i<si; i++){ replacementSeq[i]=ret[i]; } return si; } } //---------------------- ll supapower(ll b, ll ex){ if (!ex) return 1; if (ex&1) return (supapower((b*b)%modu, ex/2) * b) % modu; return supapower((b*b)%modu, ex/2) % modu; } int countReplacement(int n, int inputSeq[]) { unordered_set<int> ch; for (int i=0; i<n; i++){ ch.insert(inputSeq[i]); } bool alldiff=0, fcase=1; if ((int)ch.size()==n){ int fi=1000000, se=1000000; for (int i=0; i<n; i++){ if (1<=inputSeq[i] && inputSeq[i]<=n && inputSeq[i]<fi){ fi=inputSeq[i]; se=i; } } if (fi==1000000){ alldiff=1; }else{ //bool check=1; for (int i=se, track=fi; i<se+n; i++, track++){ if (1<=inputSeq[i%n] && inputSeq[i%n]<=n){ if (inputSeq[i%n] == track){ }else{ fcase=0; break; } } } } }else{ return 0; } if (fcase == alldiff && !alldiff) return 0; ll ans=1; vi aux; for (int i=0; i<n; i++){ if (inputSeq[i]>n){ aux.eb(inputSeq[i]); } } int ss=aux.size(); sort(all(aux)); for (int i=0; i<ss; i++){ ll di; if (!i){ di=aux[i]-n-1; }else{ di=aux[i] - aux[i-1] -1; } if (di>0){ ans*=supapower((ll)ss-i, (ll)di); ans%=modu; } } if (alldiff) ans*=(ll)n; ans%=modu; 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...