Submission #1169809

#TimeUsernameProblemLanguageResultExecution timeMemory
1169809anmattroiSorting (IOI15_sorting)C++17
100 / 100
322 ms20860 KiB
#include "sorting.h" #include <bits/stdc++.h> #define fi first #define se second #define maxn 200005 using namespace std; using ii = pair<int, int>; int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) { int ANS; if (1) { vector<int> a(N, 0), par(N, 0); int slt; function<int(int)> find_set = [&](int v) { return par[v] < 0 ? v : par[v] = find_set(par[v]); }; function<void(int, int)> union_set = [&](int u, int v) { u = find_set(u); v = find_set(v); if (u == v) return; if (par[u] < par[v]) swap(u, v); par[v] += par[u]; par[u] = v; --slt; }; function<int(int)> ok = [&](int o) { slt = N; for (int i = 0; i < N; i++) a[i] = i; for (int i = o-1; i >= 0; i--) swap(a[X[i]], a[Y[i]]); fill(par.begin(), par.end(), -1); for (int i = 0; i < N; i++) union_set(S[i], a[i]); return (N - slt <= o); }; int lo = -1, hi = M; while (hi - lo > 1) { int mid = (lo + hi) >> 1; if (ok(mid)) hi = mid; else lo = mid; } ANS = hi; } vector<int> a(N, 0), pos(N, 0); for (int i = 0; i < N; i++) a[i] = i; for (int i = ANS-1; i >= 0; i--) swap(a[X[i]], a[Y[i]]); set<ii> q; for (int i = 0; i < N; i++) if (a[i] != S[i]) q.insert(ii{a[i], S[i]}); for (int i = 0; i < N; i++) pos[a[i]] = i; for (int step = 0; step < ANS; step++) { swap(pos[a[X[step]]], pos[a[Y[step]]]); swap(a[X[step]], a[Y[step]]); if (q.empty()) { P[step] = 0; Q[step] = 0; continue; } auto [u, v] = *q.begin(); auto [x, y] = *q.lower_bound(ii{v, 0}); q.erase(ii{u, v}); q.erase(ii{x, y}); if (u != y) q.insert(ii{u, y}); P[step] = pos[u]; Q[step] = pos[x]; } return ANS; }
#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...