#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; } |
English