Submission #679598

#TimeUsernameProblemLanguageResultExecution timeMemory
679598speedyArdaGondola (IOI14_gondola)C++14
25 / 100
46 ms5580 KiB
#include "gondola.h" #include "bits/stdc++.h" using namespace std; using ll = long long; int freq[250005]; 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 now = n + 1; idx = 0; for(int i = 1; i <= biggest; i++) { if(used[i] != 0) can_be_used.erase(used[i]); else { int num = *(can_be_used.begin()); replacementSeq[idx] = num; used[reve[num]] = now; reve[now] = now; can_be_used.erase(num); can_be_used.insert(now); idx++; now++; } } return biggest - n; } //---------------------- int countReplacement(int n, int inputSeq[]) { return -3; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:49: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]
   49 |   for(int i = 1; i < originals.size(); i++)
      |                  ~~^~~~~~~~~~~~~~~~~~
gondola.cpp:67: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]
   67 |     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...