Submission #379219

#TimeUsernameProblemLanguageResultExecution timeMemory
379219MounirGondola (IOI14_gondola)C++14
100 / 100
74 ms6500 KiB
#include "gondola.h" #include <bits/stdc++.h> #define pb push_back #define sz(x) (int)x.size() #define chmax(x, v) x = max(x, v) #define all(x) x.begin(), x.end() using namespace std; int valid(int n, int inputSeq[]) { vector<int> restant; map<int, bool> vu; for (int ind = 0; ind < n; ++ind){ if (vu[inputSeq[ind]]) return 0; vu[inputSeq[ind]] = true; if (inputSeq[ind] <= n) restant.pb(ind); } for (int ind = 0; ind < sz(restant) - 1; ++ind){ int a = restant[ind] - inputSeq[restant[ind]], b = restant[ind + 1] - inputSeq[restant[ind + 1]]; a += n; a %= n; b += n; b %= n; if (a != b) return 0; } return 1; } //---------------------- struct Element { int ind, val; bool operator < (const Element &autre) const { return val < autre.val; } }; int get(int id, int deb, int n){ if (id > deb) return id - deb; else return n - deb + id; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int maxi = 0, deb = 0; set<Element> reste; for (int ind = 0; ind < n; ++ind){ chmax(maxi, gondolaSeq[ind]); if (gondolaSeq[ind] > n){ //cout << "val " << ind << " " << gondolaSeq[ind] << endl; reste.insert({ind, gondolaSeq[ind]}); } else deb = (ind -gondolaSeq[ind] + n)%n; } vector<int> actu(n); for (int i = 0; i < n; ++i) actu[i] = get(i, deb, n); for (int tour = n + 1; tour <= maxi; ++tour){ int id = reste.begin()->ind; replacementSeq[tour - n - 1] = actu[id]; actu[id] = tour; reste.erase(reste.begin()); if (tour != gondolaSeq[id]) reste.insert({id, tour}); } return maxi - n; } //---------------------- const int MOD = 1e9 + 9; long long fastExpo(int val, int exposant){ if (exposant == 0) return 1; if (exposant == 1) return val; long long res = fastExpo(val, exposant/2); res = (res * res)%MOD; if (exposant%2 == 1) res = (res * val)%MOD; return res; } int countReplacement(int n, int inputSeq[]){ long long nb = 1; bool entier = true; vector<int> reste; for (int ind = 0; ind < n; ++ind){ if (inputSeq[ind] > n) reste.pb(inputSeq[ind]); else entier = false; } reste.pb(n); sort(all(reste)); for (int ind = 1; ind < sz(reste); ++ind){ // cout << sz(reste) - ind << " " << reste[ind] << " " << reste[ind - 1] << endl; int a = fastExpo(sz(reste) - ind, reste[ind] - reste[ind - 1] - 1)%MOD; // cout << a << endl << endl; nb = (nb * a)%MOD; } if (entier) nb = (nb * n)%MOD; return (valid(n, inputSeq) * (nb + MOD)%MOD)%MOD; }
#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...