#include <algorithm> #include <iostream> #include <unordered_map> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> heights(n); vector<pair<int, int>> height_and_ind(n); for (int i = 0; i < n; ++i) { cin >> heights[i]; height_and_ind[i]= make_pair(heights[i], i); } sort(height_and_ind.begin(), height_and_ind.end()); for (int i = 0; i < n; ++i) { auto& [_, ind] = height_and_ind[i]; heights[ind] = i; } vector<vector<int>> steps; while (true) { bool sorted = true; for (int i = 0; i < n; ++i) { if (heights[i] != i) { sorted = false; break; } } if (sorted) break; vector<bool> moved(n, false); vector<vector<int>> sub_arrays; vector<pair<int, int>> swaps; for (int i = 0; i < n; ++i) { if (moved[i]) continue; if (heights[i] == i) continue; auto& curr_sub = sub_arrays.emplace_back(); int next = i; while (!moved[next]) { moved[next] = true; curr_sub.emplace_back(next); next = heights[next]; } } for (auto& sub_array : sub_arrays) { if (sub_array.size() < 2) { continue; } else if (sub_array.size() == 2 || sub_array.size() == 3) { swaps.emplace_back(sub_array[0], sub_array[1]); } else { int mid_point = sub_array.size() / 2; int left = 0; int right = mid_point - 1; while (left < right) { swaps.emplace_back(sub_array[left++], sub_array[right--]); } left = mid_point; right = sub_array.size() - 1; while (left < right) { swaps.emplace_back(sub_array[left++], sub_array[right--]); } } } for (auto& [from, to] : swaps) { swap(heights[from], heights[to]); } auto& step = steps.emplace_back();; step.reserve(swaps.size() * 2); for (int i = 0; i < swaps.size(); ++i) { step.push_back(swaps[i].first); } for (int i = swaps.size()-1; i >= 0; --i) { step.push_back(swaps[i].second); } } cout << steps.size() << endl; for (auto& step : steps) { cout << step.size() << endl; for (auto ind : step) { cout << ind + 1 << " "; } cout << endl; } 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 100 | #include <algorithm> #include <iostream> #include <unordered_map> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> heights(n); vector<pair<int, int>> height_and_ind(n); for (int i = 0; i < n; ++i) { cin >> heights[i]; height_and_ind[i]= make_pair(heights[i], i); } sort(height_and_ind.begin(), height_and_ind.end()); for (int i = 0; i < n; ++i) { auto& [_, ind] = height_and_ind[i]; heights[ind] = i; } vector<vector<int>> steps; while (true) { bool sorted = true; for (int i = 0; i < n; ++i) { if (heights[i] != i) { sorted = false; break; } } if (sorted) break; vector<bool> moved(n, false); vector<vector<int>> sub_arrays; vector<pair<int, int>> swaps; for (int i = 0; i < n; ++i) { if (moved[i]) continue; if (heights[i] == i) continue; auto& curr_sub = sub_arrays.emplace_back(); int next = i; while (!moved[next]) { moved[next] = true; curr_sub.emplace_back(next); next = heights[next]; } } for (auto& sub_array : sub_arrays) { if (sub_array.size() < 2) { continue; } else if (sub_array.size() == 2 || sub_array.size() == 3) { swaps.emplace_back(sub_array[0], sub_array[1]); } else { int mid_point = sub_array.size() / 2; int left = 0; int right = mid_point - 1; while (left < right) { swaps.emplace_back(sub_array[left++], sub_array[right--]); } left = mid_point; right = sub_array.size() - 1; while (left < right) { swaps.emplace_back(sub_array[left++], sub_array[right--]); } } } for (auto& [from, to] : swaps) { swap(heights[from], heights[to]); } auto& step = steps.emplace_back();; step.reserve(swaps.size() * 2); for (int i = 0; i < swaps.size(); ++i) { step.push_back(swaps[i].first); } for (int i = swaps.size()-1; i >= 0; --i) { step.push_back(swaps[i].second); } } cout << steps.size() << endl; for (auto& step : steps) { cout << step.size() << endl; for (auto ind : step) { cout << ind + 1 << " "; } cout << endl; } return 0; } |