#include<bits/stdc++.h>
using namespace std;
const int MAXN = 6e3+7;
bitset<MAXN> vis;
vector<int> adj[MAXN], A, B,gdzie;
deque<int> tab[MAXN];
int n, poz[MAXN], cnt = 0;
void dfs(int v, int p) {
vis[v] = 1;
cnt++;
for(int s : adj[v]) {
if(s == p || vis[s]) continue;
dfs(s, v);
}
}
bitset<MAXN> ogr, zro;
void gen(int v, deque<int> &T, int p) {
vis[v] = 1;
for(int s : adj[v]) {
if(s == p || vis[s]) continue;
if(!ogr[v] && !zro[s] && !zro[poz[A[v]]]) {
T.push_back(poz[A[v]]);
T.push_front(s);
int tutaj = poz[A[v]];
zro[tutaj] = 1;
poz[A[v]] = s;
poz[B[s]] = tutaj;
swap(B[tutaj], B[s]);
ogr[v] = 1;
zro[s] = 1;
}
gen(s,T,v);
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
for(int i = 0; i < n; ++i) {
int a;
cin >> a;
A.push_back(a);
poz[a] = i;
}
B = A;
sort(B.begin(), B.end());
for(int i = 0; i < n; ++i) {
if(poz[B[i]] != i) {
adj[poz[B[i]]].push_back(i);
}
}
B = A;
int res = 0;
for(int i = 0; i < n; ++i) {
cnt = 0;
if(!vis[i]) dfs(i, -1);
int ile = (int)__lg(cnt);
int moz = ile;
if(cnt > (1 << moz)) moz++;
res = max(res, moz);
}
//cout << res << '\n';
int ile = 0, ostCnt = 0;;
while(true) {
ile++;
deque<int> T;
for(int i = 0; i < n; ++i) {
vis[i] = 0;
zro[i] = 0;
}
for(int i = 0; i < n; ++i) {
if(!ogr[i]) {
gen(i, T, -1);
}
}
tab[ile-1] = T;
int cnt = 0;
for(int i = 0; i < n; ++i) {
if(!ogr[i]) cnt++;
}
//cout << cnt << '\n';
if(cnt == ostCnt) break;
ostCnt = cnt;
}
while(!tab[ile-1].size()) --ile;
deque<int> ost = tab[ile-1];
if(ost.front() == ost.back()) ile--;
cout << ile << '\n';
for(int i = 0; i < ile; ++i) {
cout << tab[i].size() << '\n';
for(int s : tab[i]) {
cout << s+1 << ' ';
}
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 97 98 99 100 101 102 | #include<bits/stdc++.h> using namespace std; const int MAXN = 6e3+7; bitset<MAXN> vis; vector<int> adj[MAXN], A, B,gdzie; deque<int> tab[MAXN]; int n, poz[MAXN], cnt = 0; void dfs(int v, int p) { vis[v] = 1; cnt++; for(int s : adj[v]) { if(s == p || vis[s]) continue; dfs(s, v); } } bitset<MAXN> ogr, zro; void gen(int v, deque<int> &T, int p) { vis[v] = 1; for(int s : adj[v]) { if(s == p || vis[s]) continue; if(!ogr[v] && !zro[s] && !zro[poz[A[v]]]) { T.push_back(poz[A[v]]); T.push_front(s); int tutaj = poz[A[v]]; zro[tutaj] = 1; poz[A[v]] = s; poz[B[s]] = tutaj; swap(B[tutaj], B[s]); ogr[v] = 1; zro[s] = 1; } gen(s,T,v); } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i = 0; i < n; ++i) { int a; cin >> a; A.push_back(a); poz[a] = i; } B = A; sort(B.begin(), B.end()); for(int i = 0; i < n; ++i) { if(poz[B[i]] != i) { adj[poz[B[i]]].push_back(i); } } B = A; int res = 0; for(int i = 0; i < n; ++i) { cnt = 0; if(!vis[i]) dfs(i, -1); int ile = (int)__lg(cnt); int moz = ile; if(cnt > (1 << moz)) moz++; res = max(res, moz); } //cout << res << '\n'; int ile = 0, ostCnt = 0;; while(true) { ile++; deque<int> T; for(int i = 0; i < n; ++i) { vis[i] = 0; zro[i] = 0; } for(int i = 0; i < n; ++i) { if(!ogr[i]) { gen(i, T, -1); } } tab[ile-1] = T; int cnt = 0; for(int i = 0; i < n; ++i) { if(!ogr[i]) cnt++; } //cout << cnt << '\n'; if(cnt == ostCnt) break; ostCnt = cnt; } while(!tab[ile-1].size()) --ile; deque<int> ost = tab[ile-1]; if(ost.front() == ost.back()) ile--; cout << ile << '\n'; for(int i = 0; i < ile; ++i) { cout << tab[i].size() << '\n'; for(int s : tab[i]) { cout << s+1 << ' '; } cout << '\n'; } } |
English