#include <bits/stdc++.h>
using namespace std;
const int maxN = 3010;
int t[maxN];
int N;
vector<vector<int>> moves;
void scale() {
map<int, int> sc;
for (int i = 0; i < N; ++i)
sc[t[i]];
int nr = 0;
for (auto &it : sc)
it.second = nr++;
for (int i = 0; i < N; ++i)
t[i] = sc[t[i]];
}
void add_changes(vector<pair<int, int>> &changes) {
if (changes.empty())
return;
moves.emplace_back();
for (auto &it : changes) {
moves.back().push_back(it.first);
// swap(t[it.first], t[it.second]);
}
reverse(changes.begin(), changes.end());
for (auto &it : changes)
moves.back().push_back(it.second);
}
void printt() {
printf("t: ");
for (int i = 0; i < N; ++i)
printf("%d ", t[i]);
puts("");
}
void prepare() {
vector<pair<int, int>> changes;
vector<int> pos(N);
for (int i = 0; i < N; ++i)
pos[t[i]] = i;
for (int i = 0; i < N; ++i) {
if (pos[i] == i)
continue;
int a = i, b = pos[i];
while (pos[b] != a) {
int c = t[a];
// printf("a = %d, looking at b=%d and c=%d\n", a, b, c);
changes.emplace_back(pos[b], pos[c]);
swap(t[pos[c]], t[pos[b]]);
swap(pos[b], pos[c]);
// printf("swapped %d with %d\n", b, c);
// printt();
a = c;
b = pos[c];
}
}
add_changes(changes);
}
void arrange() {
vector<pair<int, int>> changes;
for (int i = 0; i < N; ++i) {
if (t[i] != i) {
changes.emplace_back(i, t[i]);
swap(t[i], t[t[i]]);
}
}
add_changes(changes);
}
int main() {
scanf("%d", &N);
for (int i = 0; i < N; ++i)
scanf("%d", t + i);
scale();
// printt();
prepare();
// printt();
arrange();
// printt();
printf("%lu\n", moves.size());
for (auto &v : moves) {
printf("%lu\n", v.size());
for (int a : v)
printf("%d ", a + 1);
puts("");
}
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; const int maxN = 3010; int t[maxN]; int N; vector<vector<int>> moves; void scale() { map<int, int> sc; for (int i = 0; i < N; ++i) sc[t[i]]; int nr = 0; for (auto &it : sc) it.second = nr++; for (int i = 0; i < N; ++i) t[i] = sc[t[i]]; } void add_changes(vector<pair<int, int>> &changes) { if (changes.empty()) return; moves.emplace_back(); for (auto &it : changes) { moves.back().push_back(it.first); // swap(t[it.first], t[it.second]); } reverse(changes.begin(), changes.end()); for (auto &it : changes) moves.back().push_back(it.second); } void printt() { printf("t: "); for (int i = 0; i < N; ++i) printf("%d ", t[i]); puts(""); } void prepare() { vector<pair<int, int>> changes; vector<int> pos(N); for (int i = 0; i < N; ++i) pos[t[i]] = i; for (int i = 0; i < N; ++i) { if (pos[i] == i) continue; int a = i, b = pos[i]; while (pos[b] != a) { int c = t[a]; // printf("a = %d, looking at b=%d and c=%d\n", a, b, c); changes.emplace_back(pos[b], pos[c]); swap(t[pos[c]], t[pos[b]]); swap(pos[b], pos[c]); // printf("swapped %d with %d\n", b, c); // printt(); a = c; b = pos[c]; } } add_changes(changes); } void arrange() { vector<pair<int, int>> changes; for (int i = 0; i < N; ++i) { if (t[i] != i) { changes.emplace_back(i, t[i]); swap(t[i], t[t[i]]); } } add_changes(changes); } int main() { scanf("%d", &N); for (int i = 0; i < N; ++i) scanf("%d", t + i); scale(); // printt(); prepare(); // printt(); arrange(); // printt(); printf("%lu\n", moves.size()); for (auto &v : moves) { printf("%lu\n", v.size()); for (int a : v) printf("%d ", a + 1); puts(""); } return 0; } |
English