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