#include <stdio.h> #include <bitset> #include <set> #include <vector> using namespace std; int tab[3200]; int perm[3200]; int n; bool wystapil[3200]; bool fix[3200]; vector<vector<int>>res; set<pair<int,int>> s; bool sorted() { for(int i=1;i<n;i++) { if(perm[i]<perm[i-1])return false; } return true; } int main() { scanf("%d\n",&n); for(int i=0;i<n;i++) { scanf("%d",tab+i); s.insert(make_pair(tab[i],i)); } int i=0; for(auto a:s) { perm[a.second]=i; i++; } /* printf("perm:\n"); for(int i=0;i<n;i++) { printf("%d ",perm[i]); } printf("\n"); */ int l=1; int r=0; while(!sorted()) { vector<int> pocz,kon; for(int i=0;i<n;i++) { int j= perm[i]; if(!fix[i] && !fix[j] && !wystapil[i] && j!=i && !wystapil[j]) { // printf("i: %d j: %d\n",i,j); pocz.push_back(i); kon.push_back(j); wystapil[i]=true; wystapil[j]=true; fix[j]=true; if(perm[j]==i)fix[i]=true; } } res.push_back(vector<int>()); for(auto a:pocz)res[r].push_back(a); for(auto i=kon.rbegin();i!=kon.rend();i++)res[r].push_back(*i); r++; for(int i=0;i<pocz.size();i++) { wystapil[kon[i]]=false; wystapil[pocz[i]]=false; int tmp = perm[pocz[i]]; perm[pocz[i]] = perm[kon[i]]; perm[kon[i]] = tmp; } } printf("%d\n",res.size()); for(auto i : res) { printf("%d\n",i.size()); for(auto j : i) { printf("%d ",j+1); } printf("\n"); } 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 | #include <stdio.h> #include <bitset> #include <set> #include <vector> using namespace std; int tab[3200]; int perm[3200]; int n; bool wystapil[3200]; bool fix[3200]; vector<vector<int>>res; set<pair<int,int>> s; bool sorted() { for(int i=1;i<n;i++) { if(perm[i]<perm[i-1])return false; } return true; } int main() { scanf("%d\n",&n); for(int i=0;i<n;i++) { scanf("%d",tab+i); s.insert(make_pair(tab[i],i)); } int i=0; for(auto a:s) { perm[a.second]=i; i++; } /* printf("perm:\n"); for(int i=0;i<n;i++) { printf("%d ",perm[i]); } printf("\n"); */ int l=1; int r=0; while(!sorted()) { vector<int> pocz,kon; for(int i=0;i<n;i++) { int j= perm[i]; if(!fix[i] && !fix[j] && !wystapil[i] && j!=i && !wystapil[j]) { // printf("i: %d j: %d\n",i,j); pocz.push_back(i); kon.push_back(j); wystapil[i]=true; wystapil[j]=true; fix[j]=true; if(perm[j]==i)fix[i]=true; } } res.push_back(vector<int>()); for(auto a:pocz)res[r].push_back(a); for(auto i=kon.rbegin();i!=kon.rend();i++)res[r].push_back(*i); r++; for(int i=0;i<pocz.size();i++) { wystapil[kon[i]]=false; wystapil[pocz[i]]=false; int tmp = perm[pocz[i]]; perm[pocz[i]] = perm[kon[i]]; perm[kon[i]] = tmp; } } printf("%d\n",res.size()); for(auto i : res) { printf("%d\n",i.size()); for(auto j : i) { printf("%d ",j+1); } printf("\n"); } return 0; } |