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