#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; typedef vector<int> vi; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() struct Cycle { vi a; vi ind; int n; vector<vi> solve() { n = sz(a); vi mapper(a.begin(), a.end()); sort(mapper.begin(), mapper.end()); for (auto& x : a) x = lower_bound(mapper.begin(), mapper.end(), x) - mapper.begin(); vi inv_a(n); for (int i = 0; i < n; i++) inv_a[a[i]] = i; vector<vi> res; while (!is_sorted(a.begin(), a.end())) { res.push_back({}); vector<bool> used(n, false); for (int x = 0; x < n; x++) { if (a[x] == x) continue; if (!used[x] && !used[inv_a[x]]) { res.back().push_back(x); res.back().push_back(inv_a[x]); used[x] = used[inv_a[x]] = true; } } for (int s = 0; s < sz(res.back()); s += 2) { swap(a[res.back()[s]], a[res.back()[s+1]]); inv_a[a[res.back()[s]]] = res.back()[s]; inv_a[a[res.back()[s+1]]] = res.back()[s+1]; } } return res; } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vi h(n); for (auto& x : h) cin >> x; vi mapper(h.begin(), h.end()); sort(mapper.begin(), mapper.end()); for (auto& x : h) x = lower_bound(mapper.begin(), mapper.end(), x) - mapper.begin(); vector<Cycle> cycles; vector<bool> visited(n, false); for (int i = 0; i < n; i++) { if (visited[i]) continue; visited[i] = true; Cycle C; C.a.push_back(h[i]); C.ind.push_back(i); int j = h[i]; while (!visited[j]) { visited[j] = true; C.a.push_back(h[j]); C.ind.push_back(j); j = h[j]; } if ((int) C.a.size() > 1) cycles.push_back(C); } vector<vi> res; for (auto& C : cycles) { auto r = C.solve(); for (int se = 0; se < sz(r); se++) { if (se >= sz(res)) res.push_back({}); for (auto i : r[se]) res[se].push_back(C.ind[i]); } } cout << sz(res) << '\n'; for (auto swaps : res) { cout << sz(swaps) << '\n'; for (int s = 0; s < sz(swaps); s += 2) cout << swaps[s] + 1 << ' '; for (int s = sz(swaps) - 1; s >= 0; s -= 2) cout << swaps[s] + 1 << ' '; cout << '\n'; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; typedef vector<int> vi; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() struct Cycle { vi a; vi ind; int n; vector<vi> solve() { n = sz(a); vi mapper(a.begin(), a.end()); sort(mapper.begin(), mapper.end()); for (auto& x : a) x = lower_bound(mapper.begin(), mapper.end(), x) - mapper.begin(); vi inv_a(n); for (int i = 0; i < n; i++) inv_a[a[i]] = i; vector<vi> res; while (!is_sorted(a.begin(), a.end())) { res.push_back({}); vector<bool> used(n, false); for (int x = 0; x < n; x++) { if (a[x] == x) continue; if (!used[x] && !used[inv_a[x]]) { res.back().push_back(x); res.back().push_back(inv_a[x]); used[x] = used[inv_a[x]] = true; } } for (int s = 0; s < sz(res.back()); s += 2) { swap(a[res.back()[s]], a[res.back()[s+1]]); inv_a[a[res.back()[s]]] = res.back()[s]; inv_a[a[res.back()[s+1]]] = res.back()[s+1]; } } return res; } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; vi h(n); for (auto& x : h) cin >> x; vi mapper(h.begin(), h.end()); sort(mapper.begin(), mapper.end()); for (auto& x : h) x = lower_bound(mapper.begin(), mapper.end(), x) - mapper.begin(); vector<Cycle> cycles; vector<bool> visited(n, false); for (int i = 0; i < n; i++) { if (visited[i]) continue; visited[i] = true; Cycle C; C.a.push_back(h[i]); C.ind.push_back(i); int j = h[i]; while (!visited[j]) { visited[j] = true; C.a.push_back(h[j]); C.ind.push_back(j); j = h[j]; } if ((int) C.a.size() > 1) cycles.push_back(C); } vector<vi> res; for (auto& C : cycles) { auto r = C.solve(); for (int se = 0; se < sz(r); se++) { if (se >= sz(res)) res.push_back({}); for (auto i : r[se]) res[se].push_back(C.ind[i]); } } cout << sz(res) << '\n'; for (auto swaps : res) { cout << sz(swaps) << '\n'; for (int s = 0; s < sz(swaps); s += 2) cout << swaps[s] + 1 << ' '; for (int s = sz(swaps) - 1; s >= 0; s -= 2) cout << swaps[s] + 1 << ' '; cout << '\n'; } return 0; } |