#include <iostream> #include<vector> #include <tuple> #include <algorithm> #include <math.h> using namespace std; vector<int> tab, tab1, CoJestCo(3005), tabFinal, GdzieJestCo; vector<vector<int>> Wypisy; vector<bool> Odwiedzone; int n; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; int a; for (int i = 0; i < n; ++i) { cin >> a; tab.push_back(a); CoJestCo[a] = i + 1; } tab1 = tab; sort(tab1.begin(), tab1.end()); GdzieJestCo.resize(n + 1); tabFinal.resize(n + 1); for (int i = 1; i <= n; ++i) { tabFinal[CoJestCo[tab1[i - 1]]] = i; GdzieJestCo[i] = CoJestCo[tab1[i - 1]]; } Odwiedzone.resize(n + 1); int counter = 1; while (true) { Wypisy.push_back({}); Odwiedzone.assign(n + 1, false); for (int i = 1; i <= n; ++i) { if (tabFinal[i] != i) { if (Odwiedzone[GdzieJestCo[i]] == false && Odwiedzone[i] == false) { Wypisy.back().push_back(i); Wypisy.back().push_back(GdzieJestCo[i]); Odwiedzone[GdzieJestCo[i]] = true; Odwiedzone[i] = true; } } } for (int j = Wypisy.back().size() - 2; j >= 0; j -= 2) { tabFinal[Wypisy.back()[j + 1]] = tabFinal[Wypisy.back()[j]]; tabFinal[Wypisy.back()[j]] = Wypisy.back()[j]; GdzieJestCo[Wypisy.back()[j]] = Wypisy.back()[j]; GdzieJestCo[tabFinal[Wypisy.back()[j + 1]]] = Wypisy.back()[j + 1]; } if (Wypisy.back().size() == 0) { Wypisy.pop_back(); break; } } cout << Wypisy.size() << endl; for (int i = 0; i < Wypisy.size(); ++i) { cout << Wypisy[i].size() << endl; for (int j = Wypisy[i].size() - 2; j >= 0; j -= 2) { cout << Wypisy[i][j] << " "; } for (int j = 1; j < Wypisy[i].size(); j += 2) { cout << Wypisy[i][j] << " "; } 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 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 | #include <iostream> #include<vector> #include <tuple> #include <algorithm> #include <math.h> using namespace std; vector<int> tab, tab1, CoJestCo(3005), tabFinal, GdzieJestCo; vector<vector<int>> Wypisy; vector<bool> Odwiedzone; int n; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; int a; for (int i = 0; i < n; ++i) { cin >> a; tab.push_back(a); CoJestCo[a] = i + 1; } tab1 = tab; sort(tab1.begin(), tab1.end()); GdzieJestCo.resize(n + 1); tabFinal.resize(n + 1); for (int i = 1; i <= n; ++i) { tabFinal[CoJestCo[tab1[i - 1]]] = i; GdzieJestCo[i] = CoJestCo[tab1[i - 1]]; } Odwiedzone.resize(n + 1); int counter = 1; while (true) { Wypisy.push_back({}); Odwiedzone.assign(n + 1, false); for (int i = 1; i <= n; ++i) { if (tabFinal[i] != i) { if (Odwiedzone[GdzieJestCo[i]] == false && Odwiedzone[i] == false) { Wypisy.back().push_back(i); Wypisy.back().push_back(GdzieJestCo[i]); Odwiedzone[GdzieJestCo[i]] = true; Odwiedzone[i] = true; } } } for (int j = Wypisy.back().size() - 2; j >= 0; j -= 2) { tabFinal[Wypisy.back()[j + 1]] = tabFinal[Wypisy.back()[j]]; tabFinal[Wypisy.back()[j]] = Wypisy.back()[j]; GdzieJestCo[Wypisy.back()[j]] = Wypisy.back()[j]; GdzieJestCo[tabFinal[Wypisy.back()[j + 1]]] = Wypisy.back()[j + 1]; } if (Wypisy.back().size() == 0) { Wypisy.pop_back(); break; } } cout << Wypisy.size() << endl; for (int i = 0; i < Wypisy.size(); ++i) { cout << Wypisy[i].size() << endl; for (int j = Wypisy[i].size() - 2; j >= 0; j -= 2) { cout << Wypisy[i][j] << " "; } for (int j = 1; j < Wypisy[i].size(); j += 2) { cout << Wypisy[i][j] << " "; } cout << endl; } } |