Submission #775287

#TimeUsernameProblemLanguageResultExecution timeMemory
775287boris_mihovGondola (IOI14_gondola)C++17
100 / 100
42 ms6592 KiB
#include "gondola.h" #include <algorithm> #include <iostream> #include <cassert> #include <numeric> #include <vector> #include <set> typedef long long llong; const int MAXNUM = 250000 + 10; const int MAXN = 100000 + 10; const int MOD = 1e9 + 9; const int INF = 1e9; std::set <int> s; llong power(llong num, llong base) { if (base == 0) { return 1; } if (base & 1) { return (num * power(num, base - 1)) % MOD; } llong res = power(num, base / 2); return (res * res) % MOD; } int n; int getPosDiff(int last, int curr) { if (last > curr) { return n - last + curr; } return curr - last; } int valid(int N, int inputSeq[]) { n = N; int minPos = 0; for (int i = 1 ; i < n ; ++i) { if (s.count(inputSeq[i])) { return 0; } s.insert(inputSeq[i]); if (inputSeq[i] < inputSeq[minPos]) { minPos = i; } } if (inputSeq[minPos] > n) { return 1; } for (int i = minPos - 1 ; i >= std::max(0, minPos - inputSeq[minPos] + 1) ; --i) { if (inputSeq[i] <= n) { return 0; } } if (minPos + 1 < inputSeq[minPos]) { for (int i = n - 1 ; i >= n + minPos + 1 - inputSeq[minPos] ; --i) { if (inputSeq[i] <= n) { return 0; } } } int lastPos = minPos; int last = inputSeq[minPos]; for (int i = minPos + 1 ; i < n ; ++i) { if (inputSeq[i] <= n) { if (last > inputSeq[i]) { return 0; } if (getPosDiff(lastPos, i) != inputSeq[i] - last) { return 0; } last = inputSeq[i]; lastPos = i; } } for (int i = 1 ; i < minPos ; ++i) { if (inputSeq[i] <= n) { if (last > inputSeq[i]) { return 0; } if (getPosDiff(lastPos, i) != inputSeq[i] - last) { return 0; } last = inputSeq[i]; lastPos = i; } } return 1; } //---------------------- int a[MAXN]; int res[MAXNUM]; int sorted[MAXN]; int replacement(int N, int gondolaSeq[], int replacementSeq[]) { n = N; int minPos = 0; for (int i = 1 ; i < n ; ++i) { if (gondolaSeq[i] < gondolaSeq[minPos]) { minPos = i; } } int cnt = gondolaSeq[minPos]; if (cnt > n) cnt = 1; for (int i = minPos ; i < n ; ++i) { a[i] = cnt++; if (cnt == n + 1) { cnt = 1; } } for (int i = 0 ; i < minPos ; ++i) { a[i] = cnt++; if (cnt == n + 1) { cnt = 1; } } std::iota(sorted, sorted + n, 0); std::sort(sorted, sorted + n, [&](int x, int y) { return gondolaSeq[x] < gondolaSeq[y]; }); int len = 0, reached = n; for (int i = 0 ; i < n ; ++i) { if (gondolaSeq[sorted[i]] <= reached) { assert(gondolaSeq[sorted[i]] <= n); continue; } replacementSeq[len++] = a[sorted[i]]; reached++; while (gondolaSeq[sorted[i]] > reached) { replacementSeq[len++] = reached; reached++; } } return len; } //---------------------- int countReplacement(int N, int inputSeq[]) { if (!valid(N, inputSeq)) { return 0; } n = N; std::vector <int> vals; for (int i = 0 ; i < n ; ++i) { if (inputSeq[i] > n) { vals.push_back(inputSeq[i]); } } int last = n; llong ans = 1; std::sort(vals.begin(), vals.end()); for (int i = 0 ; i < vals.size() ; ++i) { ans *= power(vals.size() - i, vals[i] - last - 1); last = vals[i]; ans %= MOD; } if (vals.size() == n) { ans *= n; ans %= MOD; } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:217:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  217 |     for (int i = 0 ; i < vals.size() ; ++i)
      |                      ~~^~~~~~~~~~~~~
gondola.cpp:224:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  224 |     if (vals.size() == 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...