Submission #1286843

#TimeUsernameProblemLanguageResultExecution timeMemory
1286843Jawad_Akbar_JJSorting (IOI15_sorting)C++20
100 / 100
120 ms14060 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; vector<pair<int, int>> vec; int ind[1<<18], s2[1<<18], seen[1<<18]; int getSwaps(int n, int s[], int m, int x[], int y[]){ vec.clear(); for (int i=0;i<n;i++) s2[i] = s[i], seen[i] = 0; for (int i=0;i<m;i++) swap(s2[x[i]], s2[y[i]]); for (int i=0;i<n;i++){ if (seen[i]) continue; while (!seen[i]){ vec.push_back({s2[s2[i]], s2[i]}); seen[i] = 1; i = s2[i]; } vec.pop_back(); } return vec.size(); } int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]){ int l = -1, r = m; while (l + 1 < r){ int mid = (l + r) / 2; if (getSwaps(n, s, mid, x, y) <= mid) r = mid; else l = mid; } m = r; getSwaps(n, s, m, x, y); for (int i=0;i<n;i++) ind[s[i]] = i; reverse(begin(vec), end(vec)); for (int i=0;i<m;i++){ swap(s[x[i]], s[y[i]]); swap(ind[s[x[i]]], ind[s[y[i]]]); if (vec.size() > 0){ auto [a, b] = vec.back(); vec.pop_back(); p[i] = ind[a], q[i] = ind[b]; swap(s[p[i]], s[q[i]]); swap(ind[s[p[i]]], ind[s[q[i]]]); } else p[i] = q[i] = 0; } return m; }
#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...