#include <bits/stdc++.h>
using namespace std;
map<int, int> sk;
int t[3005];
void printAns(vector<deque<int>> &ans) {
cout << ans.size() << "\n";
for (auto i : ans) {
cout << i.size() << "\n";
for (auto j : i) {
cout << j << " ";
}
cout << "\n";
}
}
int32_t main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> t[i];
sk[t[i]] = 1;
}
int N = 0;
for (auto &i : sk) {
i.second = ++N;
}
for (int i = 1; i <= n; i++) {
t[i] = sk[t[i]];
}
vector<deque<int>> ans;
while (!is_sorted(t + 1, t + n + 1)) {
vector<int> braned(n + 1, 0);
deque<int> swaps;
for (int i = 1; i <= n; i++) {
// cerr << "AAAA";
if (!braned[i]) {
vector<int> vis(n + 1, 0);
vector<int> cyc;
int pos = i;
while (!vis[pos]) {
cyc.push_back(pos);
vis[pos] = 1;
pos = t[pos];
}
if (cyc.size() == 1) continue;
int j = 0, k = cyc.size() / 2;
if (braned[cyc[k]] || braned[cyc[j]]) continue;
swaps.push_front(cyc[j]);
swaps.push_back(cyc[k]);
swap(t[cyc[j]], t[cyc[k]]);
braned[cyc[j]] = braned[cyc[k]] = 1;
j = (j + 1) % cyc.size();
k = (k - 1 + cyc.size()) % cyc.size();
while (!braned[cyc[j]] && !braned[cyc[k]] && j != k) {
// cerr << "XD";
swaps.push_front(cyc[j]);
swaps.push_back(cyc[k]);
swap(t[cyc[j]], t[cyc[k]]);
braned[cyc[j]] = braned[cyc[k]] = 1;
j = (j + 1) % cyc.size();
k = (k - 1 + cyc.size()) % cyc.size();
}
j = cyc.size() / 2 + 1, k = cyc.size() - 1;
while (!braned[cyc[j]] && !braned[cyc[k]] && j != k) {
// cerr << "XD";
swaps.push_front(cyc[j]);
swaps.push_back(cyc[k]);
swap(t[cyc[j]], t[cyc[k]]);
braned[cyc[j]] = braned[cyc[k]] = 1;
j = (j + 1) % cyc.size();
k = (k - 1 + cyc.size()) % cyc.size();
}
// for (auto i : swaps) cerr << i << " ";
// cerr << "\n";
// int best_j = -1, best_k = -1;
// for (int j = 0; j < cyc.size(); j++) {
// for (int k = j + 1; k < cyc.size(); k++) {
// if (!braned[cyc[j]] && !braned[cyc[k]]) {
// if (min(k - j, (int)cyc.size() - (k - j)) >=
// min(best_k - best_j, (int)cyc.size() - (best_k - best_j))) {
// best_j = j;
// best_k = k;
// }
// }
// }
// }
// if (best_j == -1) continue;
// int idx_j = cyc[best_j], idx_k = cyc[best_k];
// swaps.push_front(idx_j);
// swaps.push_back(idx_k);
// braned[idx_j] = braned[idx_k] = 1;
// swap(t[idx_j], t[idx_k]);
// for (int j = 1; j <= n; j++) {
// cerr << t[j] << " ";
// }
// cerr << "\n";
}
}
ans.push_back(swaps);
// printAns(ans);
// return 0;
}
printAns(ans);
}
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #include <bits/stdc++.h> using namespace std; map<int, int> sk; int t[3005]; void printAns(vector<deque<int>> &ans) { cout << ans.size() << "\n"; for (auto i : ans) { cout << i.size() << "\n"; for (auto j : i) { cout << j << " "; } cout << "\n"; } } int32_t main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> t[i]; sk[t[i]] = 1; } int N = 0; for (auto &i : sk) { i.second = ++N; } for (int i = 1; i <= n; i++) { t[i] = sk[t[i]]; } vector<deque<int>> ans; while (!is_sorted(t + 1, t + n + 1)) { vector<int> braned(n + 1, 0); deque<int> swaps; for (int i = 1; i <= n; i++) { // cerr << "AAAA"; if (!braned[i]) { vector<int> vis(n + 1, 0); vector<int> cyc; int pos = i; while (!vis[pos]) { cyc.push_back(pos); vis[pos] = 1; pos = t[pos]; } if (cyc.size() == 1) continue; int j = 0, k = cyc.size() / 2; if (braned[cyc[k]] || braned[cyc[j]]) continue; swaps.push_front(cyc[j]); swaps.push_back(cyc[k]); swap(t[cyc[j]], t[cyc[k]]); braned[cyc[j]] = braned[cyc[k]] = 1; j = (j + 1) % cyc.size(); k = (k - 1 + cyc.size()) % cyc.size(); while (!braned[cyc[j]] && !braned[cyc[k]] && j != k) { // cerr << "XD"; swaps.push_front(cyc[j]); swaps.push_back(cyc[k]); swap(t[cyc[j]], t[cyc[k]]); braned[cyc[j]] = braned[cyc[k]] = 1; j = (j + 1) % cyc.size(); k = (k - 1 + cyc.size()) % cyc.size(); } j = cyc.size() / 2 + 1, k = cyc.size() - 1; while (!braned[cyc[j]] && !braned[cyc[k]] && j != k) { // cerr << "XD"; swaps.push_front(cyc[j]); swaps.push_back(cyc[k]); swap(t[cyc[j]], t[cyc[k]]); braned[cyc[j]] = braned[cyc[k]] = 1; j = (j + 1) % cyc.size(); k = (k - 1 + cyc.size()) % cyc.size(); } // for (auto i : swaps) cerr << i << " "; // cerr << "\n"; // int best_j = -1, best_k = -1; // for (int j = 0; j < cyc.size(); j++) { // for (int k = j + 1; k < cyc.size(); k++) { // if (!braned[cyc[j]] && !braned[cyc[k]]) { // if (min(k - j, (int)cyc.size() - (k - j)) >= // min(best_k - best_j, (int)cyc.size() - (best_k - best_j))) { // best_j = j; // best_k = k; // } // } // } // } // if (best_j == -1) continue; // int idx_j = cyc[best_j], idx_k = cyc[best_k]; // swaps.push_front(idx_j); // swaps.push_back(idx_k); // braned[idx_j] = braned[idx_k] = 1; // swap(t[idx_j], t[idx_k]); // for (int j = 1; j <= n; j++) { // cerr << t[j] << " "; // } // cerr << "\n"; } } ans.push_back(swaps); // printAns(ans); // return 0; } printAns(ans); } |
English