// Mateusz Bogusławski
#include <functional>
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;
int main() {
int n, h[3000] = {}, s[3000] = {};
cin >> n;
for (int i = 0; i < n; i++) {
cin >> h[i];
s[i] = h[i];
}
sort(s, s + sizeof(s)/sizeof(s[0]), greater<int>());
unordered_map<int, int> n2pos;
for (int i = 0; i < n; i++) {
n2pos[s[i]] = n-1-i;
}
vector< vector<int> > m;
bool f = true;
int c = -1;
while(f) {
c++;
m.resize(c+1);
f = false;
bool b[3000] = {};
for (int i = 0; i < n; i++) {
if ( b[i] || b[n2pos[h[i]]] ) { continue; }
if (i != n2pos[h[i]]) {
b[i] = b[n2pos[h[i]]] = true;
m[c].insert(m[c].begin(), i);
m[c].push_back(n2pos[h[i]]);
int tmp = h[i];
h[i] = h[n2pos[h[i]]];
h[n2pos[tmp]] = tmp;
f = true;
}
}
}
cout << m.size()-1 << endl;
for (int i = 0; i < m.size()-1; i++) {
cout << m[i].size() << endl;
for (int j = 0; j < m[i].size(); j++) {
cout << m[i][j]+1 << " ";
}
cout << endl;
}
}
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 | // Mateusz Bogusławski #include <functional> #include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int main() { int n, h[3000] = {}, s[3000] = {}; cin >> n; for (int i = 0; i < n; i++) { cin >> h[i]; s[i] = h[i]; } sort(s, s + sizeof(s)/sizeof(s[0]), greater<int>()); unordered_map<int, int> n2pos; for (int i = 0; i < n; i++) { n2pos[s[i]] = n-1-i; } vector< vector<int> > m; bool f = true; int c = -1; while(f) { c++; m.resize(c+1); f = false; bool b[3000] = {}; for (int i = 0; i < n; i++) { if ( b[i] || b[n2pos[h[i]]] ) { continue; } if (i != n2pos[h[i]]) { b[i] = b[n2pos[h[i]]] = true; m[c].insert(m[c].begin(), i); m[c].push_back(n2pos[h[i]]); int tmp = h[i]; h[i] = h[n2pos[h[i]]]; h[n2pos[tmp]] = tmp; f = true; } } } cout << m.size()-1 << endl; for (int i = 0; i < m.size()-1; i++) { cout << m[i].size() << endl; for (int j = 0; j < m[i].size(); j++) { cout << m[i][j]+1 << " "; } cout << endl; } } |
English