#include<bits/stdc++.h> using namespace std; const int N = 3005; int n, t[N]; vector<int> sL, sP; vector< vector<int> > odp; pair<int, int> tp[N]; int znajdz_id(int x){ for(int i = 1 ; i <= n ; i++){ if(t[i] == x) return i; } return -1; } void wypisz(){ // cout <<" KONIEC SERI: "; vector<int> temp; for(int k = 0 ; k < sL.size() ; k++){ // cout << sL[k]<<" "; temp.push_back(sL[k]); } for(int k = sP.size() - 1 ; k >= 0 ; k--){ // cout << sP[k] <<" "; temp.push_back(sP[k]); } if(temp.size() > 0 ) odp.push_back(temp); // cout <<"\n"; sP.clear(); sL.clear(); } bool czyMoznaDodac(int x, int y){ bool mozna = true; for(int k = 0 ; k < sL.size() ; k++){ if(x == sL[k] || y == sL[k]) mozna = false; } for(int k = 0 ; k < sP.size() ; k++){ if(x == sP[k] || y == sP[k]) mozna = false; } return mozna; } int main(){ cin >> n; for(int i = 1 ; i <= n ; i++){ cin >> t[i]; tp[i] = {t[i], i}; } sort(tp + 1, tp + n + 1); for(int i = 1 ; i <= n ; i++){ int id = tp[i].second; t[id] = i; } for(int elo = 1 ; elo <= 1000 ; elo++){ for(int i = 1 ; i <= n ; i++){ //chcemu tutaj dac i, -> znajdz takie j, że t[j] = i to jest nasz swap int id_i = znajdz_id(i); if(id_i != i){ if(czyMoznaDodac(i, id_i)){ swap(t[i], t[id_i]); sL.push_back(i); sP.push_back(id_i); } } } if(sL.size() == 0) break; wypisz(); } printf("%ld\n", odp.size()); for(auto x : odp){ printf("%ld\n", x.size()); for(auto y : x){ printf("%d ",y); } printf("\n"); } // for(int i = 1 ; i <= n ; i++){ // cout << t[i] <<" "; // } }
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 | #include<bits/stdc++.h> using namespace std; const int N = 3005; int n, t[N]; vector<int> sL, sP; vector< vector<int> > odp; pair<int, int> tp[N]; int znajdz_id(int x){ for(int i = 1 ; i <= n ; i++){ if(t[i] == x) return i; } return -1; } void wypisz(){ // cout <<" KONIEC SERI: "; vector<int> temp; for(int k = 0 ; k < sL.size() ; k++){ // cout << sL[k]<<" "; temp.push_back(sL[k]); } for(int k = sP.size() - 1 ; k >= 0 ; k--){ // cout << sP[k] <<" "; temp.push_back(sP[k]); } if(temp.size() > 0 ) odp.push_back(temp); // cout <<"\n"; sP.clear(); sL.clear(); } bool czyMoznaDodac(int x, int y){ bool mozna = true; for(int k = 0 ; k < sL.size() ; k++){ if(x == sL[k] || y == sL[k]) mozna = false; } for(int k = 0 ; k < sP.size() ; k++){ if(x == sP[k] || y == sP[k]) mozna = false; } return mozna; } int main(){ cin >> n; for(int i = 1 ; i <= n ; i++){ cin >> t[i]; tp[i] = {t[i], i}; } sort(tp + 1, tp + n + 1); for(int i = 1 ; i <= n ; i++){ int id = tp[i].second; t[id] = i; } for(int elo = 1 ; elo <= 1000 ; elo++){ for(int i = 1 ; i <= n ; i++){ //chcemu tutaj dac i, -> znajdz takie j, że t[j] = i to jest nasz swap int id_i = znajdz_id(i); if(id_i != i){ if(czyMoznaDodac(i, id_i)){ swap(t[i], t[id_i]); sL.push_back(i); sP.push_back(id_i); } } } if(sL.size() == 0) break; wypisz(); } printf("%ld\n", odp.size()); for(auto x : odp){ printf("%ld\n", x.size()); for(auto y : x){ printf("%d ",y); } printf("\n"); } // for(int i = 1 ; i <= n ; i++){ // cout << t[i] <<" "; // } } |