Submission #164474

#TimeUsernameProblemLanguageResultExecution timeMemory
164474dantoh000Gondola (IOI14_gondola)C++14
100 / 100
78 ms8808 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod = 1000000009; ll exp(int a, int x){ if (x == 0) return 1ll; ll p = exp(a,x/2); p *= p; p %= mod; if (x & 1) p *= a; p %= mod; return p; } int valid(int n, int inputSeq[]) { int anchor[n]; unordered_set<int> s; int last = -1; for (int i = 0; i < n; i++){ s.insert(inputSeq[i]); if (inputSeq[i] > n) continue; anchor[i] = (i+n-inputSeq[i])%n; //printf("%d ",anchor[i]); if (last == -1){ last = anchor[i]; } else{ if (last != anchor[i]) return 0; } } if (s.size() != n) return 0; return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int l = 0; int maxpos = 1; unordered_map<int,int> pos; for (int i = 0; i < n; i++){ if (gondolaSeq[maxpos-1] < gondolaSeq[i]) maxpos = i+1; } l = gondolaSeq[maxpos-1] - n; int curseq[n]; bool can = false; for (int i = 0; i < n; i++){ pos[gondolaSeq[i]] = i+1; if (gondolaSeq[i] <= n){ can = true; curseq[i] = gondolaSeq[i]; } else curseq[i] = (curseq[(n+i-1)%n]) % n +1 ; } for (int i = 0; i < n; i++){ if (can) curseq[i] = (curseq[(n+i-1)%n]) % n + 1; else curseq[i] = i+1; pos[curseq[i]] = i+1; //printf("%d ",curseq[i]); } for (int i = 0; i < l; i++){ if (pos[i+n+1] == 0) pos[i+n+1] = maxpos; //printf("replacing %d %d\n",i+n+1,pos[i+n+1]); replacementSeq[i] = curseq[pos[i+n+1]-1]; curseq[pos[i+n+1]-1] = i+n+1; pos[replacementSeq[i]] = pos[i+n+1]; } return l; } int countReplacement(int n, int inputSeq[]) { if (!valid(n,inputSeq)) return 0; int mx = *max_element(inputSeq,inputSeq+n); ll ans = 1; int ct = n; vector<int> v; for (int i = 0; i < n; i++){ if (inputSeq[i] <= n) ct--; else v.push_back(inputSeq[i]); } if (ct == n) ans = n; v.push_back(n); sort(v.begin(),v.end()); for (int i = 1; i < (int)v.size(); i++){ ans *= exp(ct,v[i]-v[i-1]-1); ans %= mod; ct--; } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:31:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (s.size() != n) return 0;
         ~~~~~~~~~^~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:71:9: warning: unused variable 'mx' [-Wunused-variable]
     int mx = *max_element(inputSeq,inputSeq+n);
         ^~
#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...