Submission #288423

#TimeUsernameProblemLanguageResultExecution timeMemory
288423Atill83Gondola (IOI14_gondola)C++14
55 / 100
33 ms2388 KiB
#include "gondola.h" #include <bits/stdc++.h> using namespace std; const int MAXN = (int)3e5 + 5; const int mod = (int) 1e9 + 9; int yer[MAXN]; int valid(int n, int inputSeq[]) { int * p = inputSeq; for (int i = 1; i <= n; i++) { yer[i] = -1; } vector<int> ot; for (int i = 0; i < n; i++) { if (inputSeq[i] <= n) { if (yer[inputSeq[i]] != -1) return 0; yer[inputSeq[i]] = i; } else { ot.push_back(inputSeq[i]); } } sort(ot.begin(), ot.end()); for (int i = 1; i < ot.size(); i++) if(ot[i] == ot[i - 1]) return 0; int mini = 0; for (int i = 1; i < n; i++){ if(p[mini] > p[i]){ mini = i; } } if(p[mini] > n) return 1; int cur = p[mini] + 1; //cerr<<mini<<endl; for(int j = 1; j < n; j++){ int idx = mini + j; idx %= n; //cerr<<p[idx]<<endl; if(p[idx] != cur && p[idx] <= n) return 0; cur++; //cerr<<cur<<endl; } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int *p = gondolaSeq, * q = replacementSeq; for (int i = 1; i <= n; i++) { yer[i] = -1; } vector<int> ot; for (int i = 0; i < n; i++) { if (gondolaSeq[i] <= n) { if (yer[gondolaSeq[i]] != -1) return 0; yer[gondolaSeq[i]] = i; } else { ot.push_back(gondolaSeq[i]); } } int curi = 0; if((int)ot.size() == n){ int mx = 0; int last = -1; for(int i = 0; i < n; i++){ int cur = gondolaSeq[i]; if(cur - n > mx){ mx = cur - n; last = i + 1; } q[cur - n - 1] = i + 1; } q[mx - 1] = 0; for(int j = 0; j < mx; j++){ if(q[j] == 0){ q[j] = last; last = n + j + 1; } } return mx; }else{ int piv = 0; for(int i = 1; i <= n; i++){ if(yer[i] != -1){ piv = i; break; } } int last = piv; last++; if(last == n + 1) last = 1; int mx = 0; int ono = -1; for(int j = 1; j < n; j++){ int idx = yer[piv] + j; idx %= n; int cur = gondolaSeq[idx]; if(cur > n){ assert(last != 0); if(mx < cur - n){ mx = cur - n; ono = last; } replacementSeq[cur - n - 1] = last; }else{ assert(cur == last); } last++; if(last == n + 1) last = 1; } replacementSeq[mx - 1] = 0; for(int i = 0; i < mx; i++){ if(replacementSeq[i] == 0){ replacementSeq[i] = ono; ono = n + i + 1; } } return mx; } } //---------------------- long long bp(long long a, long long b){ long long res = 1; while(b){ if(b % 2) res = (res * a) % mod; a = (a * a) % mod; b = b / 2; } return res; } int countReplacement(int n, int inputSeq[]) { int *p = inputSeq; if(!valid(n, inputSeq)){ return 0; } sort(p, p + n); long long ans = 1; cerr<<"ali"<<endl; for(int i = 0; i < n - 1; i++){ ans = ans*bp(n - i - 2, (p[i + 1] - p[i] - 1)); ans %= mod; } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:29:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   29 |     for (int i = 1; i < ot.size(); i++)
      |                     ~~^~~~~~~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:58:10: warning: unused variable 'p' [-Wunused-variable]
   58 |     int *p = gondolaSeq, * q = replacementSeq;
      |          ^
gondola.cpp:77:9: warning: unused variable 'curi' [-Wunused-variable]
   77 |     int curi = 0;
      |         ^~~~
#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...