#include <bits/stdc++.h> using namespace std; const int MAX = 3003; int n, hi; int tab[MAX], poz[MAX]; bool bylo[MAX]; vector<int> wart, W, inv, nn; vector<vector<int>> res; void wyczysc() { W.clear(); W.shrink_to_fit(); inv.clear(); inv.shrink_to_fit(); nn.clear(); nn.shrink_to_fit(); for (int i = 0; i < n; i++) bylo[tab[i]] = 0; return; } void przestaw() { int x = W.size(); for (int i = 0; i < x / 2; i++) { int p1 = W[i], p2 = W[x - i - 1]; swap(tab[p1], tab[p2]); poz[tab[p1]] = p1, poz[tab[p2]] = p2; } return; } void wypisz() { cout << res.size() << "\n"; for (auto v : res) { cout << v.size() << "\n"; for (auto a : v) { cout << a + 1 << " "; } cout << "\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> tab[i]; wart.push_back(tab[i]); poz[tab[i]] = i; } sort(wart.begin(), wart.end()); int start = 0; bool prz = 0; while (start < n - 1) { wyczysc(); prz = 0; for (int i = start; i < n; i++) { // cout << "i = " << i << "\n"; if (poz[wart[i]] == i) { // cout << "IN IFFFF, i = " << i << "\n"; if (prz == 0) start = i; continue; } // cout << "wart[i] = " << wart[i] << "\n"; // cout << "tab[i] = " << tab[i] << "\n"; // cout << "bylo[wart[i]] = " << bylo[wart[i]] << "\n"; // cout << "bylo[tab[i]] = " << bylo[tab[i]] << "\n"; // cout << "poz[wart[i]] " << poz[wart[i]] << "\n"; // cout << "juzmam[wart[i]]" << juzmam[wart[i]] << "\n"; if (!bylo[wart[i]] && !bylo[tab[i]]) { bylo[wart[i]] = true; bylo[tab[i]] = true; W.push_back(poz[wart[i]]); inv.push_back(i); if (prz == 0) start = i; } else { prz = 1; } // } // { // // cout << "W.push_back() " << poz[wart[i]] << "\n"; // // W.push_back(poz[wart[i]]); // // juzmam[wart[i]] = true; // // cout << "juzmam[" << wart[i] << "] = true\n"; // // cout << "juzmam[" << tab[i + 1] << "] ?? false\n"; // if (!juzmam[tab[i + 1]]) // { // // cout << "inv.push_back() " << i + 1 << "\n"; // if (tab[poz[wart[i]]] > tab[i + 1]) // { // W.push_back(poz[wart[i]]); // juzmam[wart[i]] = true; // inv.push_back(i + 1); // juzmam[tab[i + 1]] = true; // // cout << "juzmam[" << tab[i + 1] << "] = true"; // } // } // } // else // { // // start = i - 1; // // break; // } // cout << "\n"; } // cout << "start = " << start << "\n W = "; for (int i = inv.size() - 1; i >= 0; i--) W.push_back(inv[i]); // for (auto a : W) // cout << a << " "; // cout << "\n"; if (W.size() > 0) res.push_back(W); // cout << "SPUSHOWANO\n"; przestaw(); // cout << "PRZESTAWIONO\nTAB: \n"; // for (int i = 0; i < n; i++) // cout << tab[i] << " "; // cout << "\n"; } wypisz(); 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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | #include <bits/stdc++.h> using namespace std; const int MAX = 3003; int n, hi; int tab[MAX], poz[MAX]; bool bylo[MAX]; vector<int> wart, W, inv, nn; vector<vector<int>> res; void wyczysc() { W.clear(); W.shrink_to_fit(); inv.clear(); inv.shrink_to_fit(); nn.clear(); nn.shrink_to_fit(); for (int i = 0; i < n; i++) bylo[tab[i]] = 0; return; } void przestaw() { int x = W.size(); for (int i = 0; i < x / 2; i++) { int p1 = W[i], p2 = W[x - i - 1]; swap(tab[p1], tab[p2]); poz[tab[p1]] = p1, poz[tab[p2]] = p2; } return; } void wypisz() { cout << res.size() << "\n"; for (auto v : res) { cout << v.size() << "\n"; for (auto a : v) { cout << a + 1 << " "; } cout << "\n"; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> tab[i]; wart.push_back(tab[i]); poz[tab[i]] = i; } sort(wart.begin(), wart.end()); int start = 0; bool prz = 0; while (start < n - 1) { wyczysc(); prz = 0; for (int i = start; i < n; i++) { // cout << "i = " << i << "\n"; if (poz[wart[i]] == i) { // cout << "IN IFFFF, i = " << i << "\n"; if (prz == 0) start = i; continue; } // cout << "wart[i] = " << wart[i] << "\n"; // cout << "tab[i] = " << tab[i] << "\n"; // cout << "bylo[wart[i]] = " << bylo[wart[i]] << "\n"; // cout << "bylo[tab[i]] = " << bylo[tab[i]] << "\n"; // cout << "poz[wart[i]] " << poz[wart[i]] << "\n"; // cout << "juzmam[wart[i]]" << juzmam[wart[i]] << "\n"; if (!bylo[wart[i]] && !bylo[tab[i]]) { bylo[wart[i]] = true; bylo[tab[i]] = true; W.push_back(poz[wart[i]]); inv.push_back(i); if (prz == 0) start = i; } else { prz = 1; } // } // { // // cout << "W.push_back() " << poz[wart[i]] << "\n"; // // W.push_back(poz[wart[i]]); // // juzmam[wart[i]] = true; // // cout << "juzmam[" << wart[i] << "] = true\n"; // // cout << "juzmam[" << tab[i + 1] << "] ?? false\n"; // if (!juzmam[tab[i + 1]]) // { // // cout << "inv.push_back() " << i + 1 << "\n"; // if (tab[poz[wart[i]]] > tab[i + 1]) // { // W.push_back(poz[wart[i]]); // juzmam[wart[i]] = true; // inv.push_back(i + 1); // juzmam[tab[i + 1]] = true; // // cout << "juzmam[" << tab[i + 1] << "] = true"; // } // } // } // else // { // // start = i - 1; // // break; // } // cout << "\n"; } // cout << "start = " << start << "\n W = "; for (int i = inv.size() - 1; i >= 0; i--) W.push_back(inv[i]); // for (auto a : W) // cout << a << " "; // cout << "\n"; if (W.size() > 0) res.push_back(W); // cout << "SPUSHOWANO\n"; przestaw(); // cout << "PRZESTAWIONO\nTAB: \n"; // for (int i = 0; i < n; i++) // cout << tab[i] << " "; // cout << "\n"; } wypisz(); return 0; } |