Submission #679609

#TimeUsernameProblemLanguageResultExecution timeMemory
679609speedyArdaGondola (IOI14_gondola)C++14
100 / 100
93 ms11856 KiB
#include "gondola.h" #include "bits/stdc++.h" using namespace std; using ll = long long; //int freq[250005]; map<ll, ll> freq; int used[250005]; int reve[250005]; const ll MOD = 1e9+9; ll binpow(ll x, ll y) { ll ans = 1; while(y > 0) { if(y & 1) ans = ans * x % MOD; x = x * x % MOD; y >>= 1; } return ans; } int valid(int n, int inputSeq[]) { if(n == 1) return 1; vector<pair<int, int> > originals; set<int> elems; for(int i = 0; i < n; i++) { elems.insert(i + 1); if(freq[inputSeq[i]] > 0) return 0; freq[inputSeq[i]]++; if(inputSeq[i] <= n) { originals.push_back({inputSeq[i], i}); } } if(originals.size() <= 1) // All elements or n-1 elements are changed, so valid return 1; int res = 1; originals.push_back({originals[0].first, originals[0].second + n}); elems.erase(originals[0].first); int curr = (originals[0].first + 1) % (n+1), idx = originals[0].second + 1; if(curr == 0) curr++; for(int i = 1; i < originals.size(); i++) { //cout << res << "\n"; while(idx < originals[i].second) { if(elems.find(curr) == elems.end()) res = 0; elems.erase(curr); curr = (curr + 1) % (n+1); if(curr == 0) curr++; idx++; } if(curr != originals[i].first) res = 0; //elems.erase(originals[i].first); if(i + 1 != originals.size()) { if(elems.find(originals[i].first) == elems.end()) res = 0; elems.erase(originals[i].first); } //cout << res << " " << idx << " " << curr << " " << originals[i].first << "\n"; idx++; curr = (curr + 1) % (n+1); if(curr == 0) curr++; } return res; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { int biggest = 0; set<int> can_be_used; vector<pair<int, int> > originals; for(int i = 0; i < n; i++) { can_be_used.insert(i + 1); biggest = max(biggest, gondolaSeq[i]); if(gondolaSeq[i] <= n) originals.push_back({gondolaSeq[i], i}); //used[gondolaSeq[i]] = i; } int idx = 0, curr = 1, finishidx = -1; if(originals.size() > 0) // There is nonchanged element we can use for reference. Since gondolaseq is already valid (the questions states) we can assume this will provide a true intiial array (1 ..... n) { finishidx = originals[0].second; idx = (originals[0].second + 1) % n; curr = (originals[0].first + 1) % (n + 1); used[originals[0].first] = originals[0].first; reve[originals[0].first] = originals[0].first; if(curr == 0) curr++; } while(idx < n) { used[gondolaSeq[idx]] = curr; reve[curr] = gondolaSeq[idx]; //if(idx == 47) //cout << gondolaSeq[idx] << " " << curr << " " << used[gondolaSeq[idx]] << "\n"; curr = (curr + 1) % (n+1); if(curr == 0) curr++; idx++; } idx = 0; while(idx < finishidx) { used[gondolaSeq[idx]] = curr; reve[curr] = gondolaSeq[idx]; curr = (curr + 1) % (n+1); if(curr == 0) curr++; idx++; } //cout << used[1] << "\n"; int last = used[biggest]; int now = n + 1; idx = 0; for(int i = 1; i <= biggest; i++) { if(i > n && (used[i] == 0 || i == biggest)) { replacementSeq[idx] = last; last = now; now++; idx++; } else if(i > n) { replacementSeq[idx] = used[i]; now++; idx++; } } return biggest - n; } //---------------------- int countReplacement(int n, int inputSeq[]) { ll ans = 1; if(valid(n, inputSeq) == 0) return 0; ll cnt = n; sort(inputSeq, inputSeq + n); ll last = n; for(int i = 0; i < n; i++) { if(inputSeq[i] <= n) { //last = inputSeq[i]; cnt--; continue; } else { ans = (ans) * binpow(cnt, (ll)(inputSeq[i] - last - 1)) % MOD; last = inputSeq[i]; cnt--; } } if(inputSeq[0] > n) // All elements are changed So we can have multiple initial orders { ans = ans * (ll)n % MOD; } return ans % MOD; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:50:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |   for(int i = 1; i < originals.size(); i++)
      |                  ~~^~~~~~~~~~~~~~~~~~
gondola.cpp:68:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |     if(i + 1 != originals.size())
      |        ~~~~~~^~~~~~~~~~~~~~~~~~~
#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...