#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <map>
using namespace std;
unsigned min(unsigned a, unsigned b) {
return a < b ? a : b;
}
unsigned max(unsigned a, unsigned b) {
return a > b ? a : b;
}
int main() {
ios_base::sync_with_stdio(false);
unsigned n;
cin >> n;
unsigned h;
vector<pair<unsigned, unsigned >> hs;
for (auto i = 1; i <= n; i++) {
cin >> h;
hs.emplace_back(h, i);
}
sort(hs.begin(), hs.end());
map<unsigned, unsigned> pos;
map<unsigned, unsigned> rev_pos;
for (unsigned i = 0; i < hs.size(); i++) {
pos.insert(make_pair(hs[i].second, i + 1));
rev_pos.insert(make_pair(i + 1, hs[i].second));
}
set<pair<unsigned, unsigned >> swaps;
set<pair<unsigned, unsigned >> pre_swaps;
for (int i = 1; i <= n; i++) {
if (pos[i] == i) {
// do nothing
} else if (pos[pos[i]] == i) {
// plan swap pos[i] - i
// cout << "pos[" << i << "]: " << pos[i] << endl;
swaps.insert(make_pair(min(i, pos[i]), max(i, pos[i])));
} else {
// cout << "pos[" << i << "]: " << pos[i] << endl;
unsigned to_fix = i;
while (to_fix != pos[to_fix] && rev_pos[to_fix] != i) {
// cout << "Adding swap: " << min(to_fix, pos[to_fix]) << " " << max(to_fix, pos[to_fix]) << endl;
swaps.insert(make_pair(min(to_fix, pos[to_fix]), max(to_fix, pos[to_fix])));
if (pos[pos[to_fix]] != to_fix) {
// cout << "Adding pre-swap: " << min(pos[to_fix], rev_pos[to_fix]) << " "
// << max(pos[to_fix], rev_pos[to_fix]) << endl;
pre_swaps.insert(make_pair(min(pos[to_fix], rev_pos[to_fix]), max(pos[to_fix], rev_pos[to_fix])));
unsigned t = pos[pos[to_fix]];
pos[pos[to_fix]] = pos[rev_pos[to_fix]];
pos[rev_pos[to_fix]] = t;
// cout << "Setting to_fix to " << rev_pos[to_fix] << endl;
to_fix = rev_pos[to_fix];
} else {
break;
}
}
}
}
if (swaps.empty()) {
cout << 0 << endl;
} else {
cout << (!pre_swaps.empty() ? 2 : 1) << endl;
if (!pre_swaps.empty()) {
cout << pre_swaps.size() * 2 << endl;
for (auto it = pre_swaps.begin(); it != pre_swaps.end(); it++) {
cout << (*it).first << " ";
}
for (auto it = pre_swaps.rbegin(); it != pre_swaps.rend(); it++) {
cout << (*it).second << " ";
}
cout << endl;
}
if (!swaps.empty()) {
cout << swaps.size() * 2 << endl;
for (auto it = swaps.begin(); it != swaps.end(); it++) {
cout << (*it).first << " ";
}
for (auto it = swaps.rbegin(); it != swaps.rend(); it++) {
cout << (*it).second << " ";
}
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 101 102 103 104 | #include <iostream> #include <vector> #include <set> #include <algorithm> #include <map> using namespace std; unsigned min(unsigned a, unsigned b) { return a < b ? a : b; } unsigned max(unsigned a, unsigned b) { return a > b ? a : b; } int main() { ios_base::sync_with_stdio(false); unsigned n; cin >> n; unsigned h; vector<pair<unsigned, unsigned >> hs; for (auto i = 1; i <= n; i++) { cin >> h; hs.emplace_back(h, i); } sort(hs.begin(), hs.end()); map<unsigned, unsigned> pos; map<unsigned, unsigned> rev_pos; for (unsigned i = 0; i < hs.size(); i++) { pos.insert(make_pair(hs[i].second, i + 1)); rev_pos.insert(make_pair(i + 1, hs[i].second)); } set<pair<unsigned, unsigned >> swaps; set<pair<unsigned, unsigned >> pre_swaps; for (int i = 1; i <= n; i++) { if (pos[i] == i) { // do nothing } else if (pos[pos[i]] == i) { // plan swap pos[i] - i // cout << "pos[" << i << "]: " << pos[i] << endl; swaps.insert(make_pair(min(i, pos[i]), max(i, pos[i]))); } else { // cout << "pos[" << i << "]: " << pos[i] << endl; unsigned to_fix = i; while (to_fix != pos[to_fix] && rev_pos[to_fix] != i) { // cout << "Adding swap: " << min(to_fix, pos[to_fix]) << " " << max(to_fix, pos[to_fix]) << endl; swaps.insert(make_pair(min(to_fix, pos[to_fix]), max(to_fix, pos[to_fix]))); if (pos[pos[to_fix]] != to_fix) { // cout << "Adding pre-swap: " << min(pos[to_fix], rev_pos[to_fix]) << " " // << max(pos[to_fix], rev_pos[to_fix]) << endl; pre_swaps.insert(make_pair(min(pos[to_fix], rev_pos[to_fix]), max(pos[to_fix], rev_pos[to_fix]))); unsigned t = pos[pos[to_fix]]; pos[pos[to_fix]] = pos[rev_pos[to_fix]]; pos[rev_pos[to_fix]] = t; // cout << "Setting to_fix to " << rev_pos[to_fix] << endl; to_fix = rev_pos[to_fix]; } else { break; } } } } if (swaps.empty()) { cout << 0 << endl; } else { cout << (!pre_swaps.empty() ? 2 : 1) << endl; if (!pre_swaps.empty()) { cout << pre_swaps.size() * 2 << endl; for (auto it = pre_swaps.begin(); it != pre_swaps.end(); it++) { cout << (*it).first << " "; } for (auto it = pre_swaps.rbegin(); it != pre_swaps.rend(); it++) { cout << (*it).second << " "; } cout << endl; } if (!swaps.empty()) { cout << swaps.size() * 2 << endl; for (auto it = swaps.begin(); it != swaps.end(); it++) { cout << (*it).first << " "; } for (auto it = swaps.rbegin(); it != swaps.rend(); it++) { cout << (*it).second << " "; } cout << endl; } } return 0; } |
English