#include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector <int> v(n); for(int i=0; i<n; i++){ cin>>v[i]; } vector <int> pos(n); vector <int> pos2(n); for(int i=0; i<n; i++){ int k=0; for(int j=0; j<n; j++){ if(v[j]<v[i]){ k++; } } pos[i]=k; pos2[k]=i; } vector <vector <int>> front; vector <vector <int>> back; vector <bool> vis(n); int ile=0; while(true){ bool czy=0; for(int i=0; i<n; i++){ if(pos[i]!=i){ czy=1; } vis[i]=0; } if(!czy){ cout<<ile<<endl; for(int i=0; i<ile; i++){ cout<<2*front[i].size()<<endl; for(int j=0; j<front[i].size(); j++){ cout<<front[i][j]<<" "; } for(int j=back[i].size()-1; j>=0; j--){ cout<<back[i][j]<<" "; } cout<<endl; } return 0; } ile++; front.resize(ile); back.resize(ile); for(int i=0; i<n; i++){ if(pos[i]!=i&&!vis[pos[i]]&&!vis[i]){ front[ile-1].push_back(i+1); back[ile-1].push_back(pos[i]+1); vis[i]=1; vis[pos[i]]=1; swap(pos2[pos[i]], pos2[pos[pos[i]]]); swap(pos[i], pos[pos[i]]); int x=i; while(pos[pos[x]]!=x){ front[ile-1].push_back(pos[x]+1); back[ile-1].push_back(pos2[x]+1); vis[pos[x]]=1; vis[pos2[x]]=1; swap(pos[pos[x]], pos[pos2[x]]); x=pos2[x]; } } } } }
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 | #include <bits/stdc++.h> using namespace std; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector <int> v(n); for(int i=0; i<n; i++){ cin>>v[i]; } vector <int> pos(n); vector <int> pos2(n); for(int i=0; i<n; i++){ int k=0; for(int j=0; j<n; j++){ if(v[j]<v[i]){ k++; } } pos[i]=k; pos2[k]=i; } vector <vector <int>> front; vector <vector <int>> back; vector <bool> vis(n); int ile=0; while(true){ bool czy=0; for(int i=0; i<n; i++){ if(pos[i]!=i){ czy=1; } vis[i]=0; } if(!czy){ cout<<ile<<endl; for(int i=0; i<ile; i++){ cout<<2*front[i].size()<<endl; for(int j=0; j<front[i].size(); j++){ cout<<front[i][j]<<" "; } for(int j=back[i].size()-1; j>=0; j--){ cout<<back[i][j]<<" "; } cout<<endl; } return 0; } ile++; front.resize(ile); back.resize(ile); for(int i=0; i<n; i++){ if(pos[i]!=i&&!vis[pos[i]]&&!vis[i]){ front[ile-1].push_back(i+1); back[ile-1].push_back(pos[i]+1); vis[i]=1; vis[pos[i]]=1; swap(pos2[pos[i]], pos2[pos[pos[i]]]); swap(pos[i], pos[pos[i]]); int x=i; while(pos[pos[x]]!=x){ front[ile-1].push_back(pos[x]+1); back[ile-1].push_back(pos2[x]+1); vis[pos[x]]=1; vis[pos2[x]]=1; swap(pos[pos[x]], pos[pos2[x]]); x=pos2[x]; } } } } } |