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