#include <bits/stdc++.h>
using namespace std;
const bool TEST = false; // do generowania przypadków testowych. Jeśli chcemy testy, zmień na true
const int TEST_COUNT = 1000;
// to tylko do generowania dużych testów
void generujDane(int count) {
vector<int> numbers;
// weź po kolei liczby
for(int i=1; i<=count; i++)
numbers.push_back(i);
// pomieszaj je
shuffle(numbers.begin(), numbers.end(), default_random_engine());
// i wyświetl
cout << count << endl;
for(int i=0; i<count; i++) {
cout << numbers[i] << endl;
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
if (TEST) {
// zamiast uruchamiać program, wygeneruj przypadki testowe
generujDane(TEST_COUNT);
return 0;
}
int N, petla = 0;
cin >> N;
vector<int> posortowana { 0 };
for (int i = 0; i < N; i++) {
int z;
cin >> z;
posortowana.push_back(z);
}
vector<int> tab = posortowana;
sort(posortowana.begin(), posortowana.end());
// tablica wskaźników, zamiast statyczna tablica 2-wymiarowa
vector<vector<int>*> odp {NULL};
vector<vector<int>*> tyl {NULL};
while (true) {
if (tab == posortowana)
break;
petla++;
odp.push_back(new vector<int>());
tyl.push_back(new vector<int>());
vector<int> jotki(N + 1); // czy ten element był już brany
for (int i = 1; i <= N; i++) {
if (jotki[i] > 0)
continue;
// na ktorym indexie chcemy byc
int liczba = tab[i], index = 0;
if (tab[i]==posortowana[i]) continue;
for (int j = 1; j <= N; j++) {
// jesli na tym chcemy byc to sb zapisz i break
if (posortowana[j] == liczba) {
index = j;
jotki[j]++;
jotki[i]++;
break;
}
}
if (i != index && jotki[index] == 1) {
tab[i] = tab[index];
tab[index] = liczba;
tyl[petla]->push_back(i);
odp[petla]->push_back(index);
}
}
for (int i=1; i<=N; i++){
if (jotki[i]==0){
tyl[petla]->push_back(i);
break;
}
}
}
cout << petla << endl;
for (int i = 1; i <= petla; i++) {
int b = odp[i]->size(), c = tyl[i]->size();
cout << b + c << endl;
bool dodajSpacje = false;
for (int j = 0; j <c; j++) {
if (dodajSpacje) {
cout << " ";
}
dodajSpacje = true;
cout << tyl[i]->at(j);
}
for (int j = b-1; j >= 0; j--) {
if (dodajSpacje) {
cout << " ";
}
dodajSpacje = true;
cout << odp[i]->at(j);
}
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 105 106 107 108 109 110 111 112 113 114 | #include <bits/stdc++.h> using namespace std; const bool TEST = false; // do generowania przypadków testowych. Jeśli chcemy testy, zmień na true const int TEST_COUNT = 1000; // to tylko do generowania dużych testów void generujDane(int count) { vector<int> numbers; // weź po kolei liczby for(int i=1; i<=count; i++) numbers.push_back(i); // pomieszaj je shuffle(numbers.begin(), numbers.end(), default_random_engine()); // i wyświetl cout << count << endl; for(int i=0; i<count; i++) { cout << numbers[i] << endl; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (TEST) { // zamiast uruchamiać program, wygeneruj przypadki testowe generujDane(TEST_COUNT); return 0; } int N, petla = 0; cin >> N; vector<int> posortowana { 0 }; for (int i = 0; i < N; i++) { int z; cin >> z; posortowana.push_back(z); } vector<int> tab = posortowana; sort(posortowana.begin(), posortowana.end()); // tablica wskaźników, zamiast statyczna tablica 2-wymiarowa vector<vector<int>*> odp {NULL}; vector<vector<int>*> tyl {NULL}; while (true) { if (tab == posortowana) break; petla++; odp.push_back(new vector<int>()); tyl.push_back(new vector<int>()); vector<int> jotki(N + 1); // czy ten element był już brany for (int i = 1; i <= N; i++) { if (jotki[i] > 0) continue; // na ktorym indexie chcemy byc int liczba = tab[i], index = 0; if (tab[i]==posortowana[i]) continue; for (int j = 1; j <= N; j++) { // jesli na tym chcemy byc to sb zapisz i break if (posortowana[j] == liczba) { index = j; jotki[j]++; jotki[i]++; break; } } if (i != index && jotki[index] == 1) { tab[i] = tab[index]; tab[index] = liczba; tyl[petla]->push_back(i); odp[petla]->push_back(index); } } for (int i=1; i<=N; i++){ if (jotki[i]==0){ tyl[petla]->push_back(i); break; } } } cout << petla << endl; for (int i = 1; i <= petla; i++) { int b = odp[i]->size(), c = tyl[i]->size(); cout << b + c << endl; bool dodajSpacje = false; for (int j = 0; j <c; j++) { if (dodajSpacje) { cout << " "; } dodajSpacje = true; cout << tyl[i]->at(j); } for (int j = b-1; j >= 0; j--) { if (dodajSpacje) { cout << " "; } dodajSpacje = true; cout << odp[i]->at(j); } cout << endl; } return 0; } |
English