#include <bits/stdc++.h> #define int long long #define pii pair<int, int> #define pb push_back #define fi first #define sec second #define cln cout<<"\n--------------------\n" using namespace std; constexpr int N = 3e3+7; constexpr int MOD = 1e9+7; vector <deque <int> > wszystkie; int M[N]; int n; int T[N]; int K[N]; void pre () { cin>>n; for (int i=1; i<=n; ++i) { cin>>T[i]; M[i] = T[i]; } sort(M, M+n+1); for (int i=1; i<=n; ++i) { K[M[i]] = i; } for (int i=1; i<=n; ++i) { T[i] = K[T[i]]; } } deque <int> szereg(const vector <vector <int> > & cykle) { deque <int> op; for (auto &x : cykle) { for (int i=0; i<x.size(); i+=2) { int a = x[i], b; if (i+1 < x.size()) { b = x[i+1]; op.push_front(a); op.push_back(b); } } } return op; } bool popraw () { vector <vector <int> > zmiana; vector <bool> O(n+1, false); for (int i=1; i<=n; ++i) { int it = i; if (!O[i]) { vector <int> cykl; do { O[it] = true; cykl.pb(it); it = T[it]; } while (!O[it]); //for (auto x : cykl) cout<<x<<' '; //cout<<'\n'; if (cykl.size() > 1) zmiana.push_back(cykl); } } if (zmiana.size() == 0) return false; auto x = szereg(zmiana); int dl = x.size(); //for (int i=0; i<dl; ++i) cout<<x[i]<<' '; //cln; for (int i=0; i<dl/2; ++i) { swap(T[x[i]], T[x[dl-i-1]]); } //for (int i=1; i<=n; i++) cout<<T[i]<<' '; //cout<<'\n'; wszystkie.pb(x); return true; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); pre(); while (popraw()); cout<<wszystkie.size()<<'\n'; for (auto &x : wszystkie) { cout<<x.size()<<'\n'; for (auto &k : x) { cout<<k<<' '; } cout<<'\n'; } }
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 | #include <bits/stdc++.h> #define int long long #define pii pair<int, int> #define pb push_back #define fi first #define sec second #define cln cout<<"\n--------------------\n" using namespace std; constexpr int N = 3e3+7; constexpr int MOD = 1e9+7; vector <deque <int> > wszystkie; int M[N]; int n; int T[N]; int K[N]; void pre () { cin>>n; for (int i=1; i<=n; ++i) { cin>>T[i]; M[i] = T[i]; } sort(M, M+n+1); for (int i=1; i<=n; ++i) { K[M[i]] = i; } for (int i=1; i<=n; ++i) { T[i] = K[T[i]]; } } deque <int> szereg(const vector <vector <int> > & cykle) { deque <int> op; for (auto &x : cykle) { for (int i=0; i<x.size(); i+=2) { int a = x[i], b; if (i+1 < x.size()) { b = x[i+1]; op.push_front(a); op.push_back(b); } } } return op; } bool popraw () { vector <vector <int> > zmiana; vector <bool> O(n+1, false); for (int i=1; i<=n; ++i) { int it = i; if (!O[i]) { vector <int> cykl; do { O[it] = true; cykl.pb(it); it = T[it]; } while (!O[it]); //for (auto x : cykl) cout<<x<<' '; //cout<<'\n'; if (cykl.size() > 1) zmiana.push_back(cykl); } } if (zmiana.size() == 0) return false; auto x = szereg(zmiana); int dl = x.size(); //for (int i=0; i<dl; ++i) cout<<x[i]<<' '; //cln; for (int i=0; i<dl/2; ++i) { swap(T[x[i]], T[x[dl-i-1]]); } //for (int i=1; i<=n; i++) cout<<T[i]<<' '; //cout<<'\n'; wszystkie.pb(x); return true; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); pre(); while (popraw()); cout<<wszystkie.size()<<'\n'; for (auto &x : wszystkie) { cout<<x.size()<<'\n'; for (auto &k : x) { cout<<k<<' '; } cout<<'\n'; } } |