Submission #1247149

#TimeUsernameProblemLanguageResultExecution timeMemory
1247149countlessSorting (IOI15_sorting)C++20
20 / 100
1 ms328 KiB
#include "sorting.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define sp <<" "<< #define endl "\n" mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { if (is_sorted(S, S+N)) return 0; int id = 0; auto check = [&](int x) -> bool { vector<int> targ(N), inv(N); iota(targ.begin(), targ.end(), 0); for (int i = 0; i < x; i++) { swap(targ[X[i]], targ[Y[i]]); } vector<bool> vis(N); int cyc = 0; for (int i = 0; i < N; i++) { if (vis[i]) continue; int at = i; while (!vis[at]) { vis[at] = true; at = S[at]; } cyc++; } return N - cyc <= x; }; auto apply = [&](int x) -> void { vector<int> A(N); for (int i = 0; i < N; i++) A[i] = S[i]; for (int i = 0; i < x; i++) { swap(A[X[i]], A[Y[i]]); } vector<bool> vis(N, 0); for (int i = 0; i < N; i++) { if (vis[i]) continue; vector<int> cyc; int at = i; while (!vis[at]) { vis[at] = true; cyc.push_back(at); at = A[at]; } for(int j = 1; j < cyc.size(); j++) { P[id] = cyc[0], Q[id] = cyc[j]; id++; swap(A[cyc[0]], A[cyc[j]]); } } }; int l = 0, r = N; while (r - l > 1) { int m = (l + r) / 2; if (check(m)) { r = m; } else { l = m; } } apply(r); return r; } // 3 0 4 2 1 //
#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...