#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
const int N = 3e3 + 5;
int tab[N], kub[N], n;
pair<int, int> scal[N];
vector<int> odp[N], pom1;
stack<int> pom2;
bitset<N> odw;
bool check(){
for(int i=1;i<=n-1;i++){
if(tab[i]>tab[i+1]){
return false;
}
}
return true;
}
void skalowanie(){
sort(scal+1, scal+n+1);
for(int i=1;i<=n;i++){
tab[scal[i].second]=i;
}
}
void repair(int idx, int ile){
odw[idx]=true;
if(ile==tab[idx]){
return;
}
pom1.pb(idx);
int b=kub[ile];
pom2.push(b);
odw[b]=true;
swap(tab[idx], tab[b]);
swap(kub[tab[idx]], kub[tab[b]]);
repair(tab[b], b);
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
int x;
cin>>x;
scal[i]={x, i};
}
skalowanie();
for(int i=1;i<=n;i++){
kub[tab[i]]=i;
}
int ans=0;
while(!check()){
ans++;
for(int i=1;i<=n;i++){
odw[i]=false;
}
for(int i=1;i<=n;i++){
if(odw[i]) continue;
repair(i, i);
}
vector<int>pp;
for(auto v : pom1){
pp.pb(v);
}
pom1.clear();
while(!pom2.empty()){
int x = pom2.top();
pom2.pop();
pp.pb(x);
}
odp[ans]=pp;
}
cout<<ans<<"\n";
for(int i=1;i<=ans;i++){
cout<<odp[i].size()<<"\n";
for(auto v : odp[i]) cout<<v<<" ";
cout<<"\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 | #include <bits/stdc++.h> #define pb push_back #define ll long long using namespace std; const int N = 3e3 + 5; int tab[N], kub[N], n; pair<int, int> scal[N]; vector<int> odp[N], pom1; stack<int> pom2; bitset<N> odw; bool check(){ for(int i=1;i<=n-1;i++){ if(tab[i]>tab[i+1]){ return false; } } return true; } void skalowanie(){ sort(scal+1, scal+n+1); for(int i=1;i<=n;i++){ tab[scal[i].second]=i; } } void repair(int idx, int ile){ odw[idx]=true; if(ile==tab[idx]){ return; } pom1.pb(idx); int b=kub[ile]; pom2.push(b); odw[b]=true; swap(tab[idx], tab[b]); swap(kub[tab[idx]], kub[tab[b]]); repair(tab[b], b); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ int x; cin>>x; scal[i]={x, i}; } skalowanie(); for(int i=1;i<=n;i++){ kub[tab[i]]=i; } int ans=0; while(!check()){ ans++; for(int i=1;i<=n;i++){ odw[i]=false; } for(int i=1;i<=n;i++){ if(odw[i]) continue; repair(i, i); } vector<int>pp; for(auto v : pom1){ pp.pb(v); } pom1.clear(); while(!pom2.empty()){ int x = pom2.top(); pom2.pop(); pp.pb(x); } odp[ans]=pp; } cout<<ans<<"\n"; for(int i=1;i<=ans;i++){ cout<<odp[i].size()<<"\n"; for(auto v : odp[i]) cout<<v<<" "; cout<<"\n"; } return 0; } |
English