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