#include <bits/stdc++.h>
std::vector<std::vector<std::pair<int, int>>> zmiany;
void ustal_zmiany(std::queue<int> q, int d) {
if(q.size() <= 1) return;
if(d==zmiany.size()) zmiany.push_back(std::vector<std::pair<int, int>>());
std::queue<int> nq;
int a, b;
while(q.size() > 1) {
a = q.front(); q.pop();
b = q.front(); q.pop();
nq.push(b);
zmiany[d].push_back({a, b});
}
if(q.size() == 1) {
nq.push(q.front()); q.pop();
}
ustal_zmiany(nq, d+1);
}
int main() {
std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);
int n;
std::cin >> n;
std::vector<int> h(n);
std::vector<int> perm(n);
std::vector<std::pair<int, int>> h_sorted(n);
for(int i=0; i<n; ++i) {
std::cin >> h[i];
h_sorted[i] = {h[i], i};
}
std::sort(h_sorted.begin(), h_sorted.end());
for(int i=0; i<n; ++i) {
perm[i] = h_sorted[i].second;
// perm[h_sorted[i].second] = i;
}
std::vector<bool> w_cyklu(n);
std::vector<std::queue<int>> cykle;
for(int i=0; i<n; ++i) {
if(w_cyklu[i]) continue;
std::queue<int> q;
int a=i;
do {
q.push(a);
w_cyklu[a] = true;
a = perm[a];
}
while(a!=i);
cykle.push_back(q);
}
for(int i=0; i<cykle.size(); ++i) {
ustal_zmiany(cykle[i], 0);
}
std::cout<<zmiany.size()<<'\n';
for(int i=0; i<zmiany.size(); ++i) {
std::cout<<zmiany[i].size()*2<<'\n';
for(int j=0; j<zmiany[i].size(); ++j) {
std::cout<<zmiany[i][j].first+1<<' ';
}
for(int j=zmiany[i].size()-1; j>=0; --j) {
std::cout<<zmiany[i][j].second+1<<' ';
}
std::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 81 | #include <bits/stdc++.h> std::vector<std::vector<std::pair<int, int>>> zmiany; void ustal_zmiany(std::queue<int> q, int d) { if(q.size() <= 1) return; if(d==zmiany.size()) zmiany.push_back(std::vector<std::pair<int, int>>()); std::queue<int> nq; int a, b; while(q.size() > 1) { a = q.front(); q.pop(); b = q.front(); q.pop(); nq.push(b); zmiany[d].push_back({a, b}); } if(q.size() == 1) { nq.push(q.front()); q.pop(); } ustal_zmiany(nq, d+1); } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL); int n; std::cin >> n; std::vector<int> h(n); std::vector<int> perm(n); std::vector<std::pair<int, int>> h_sorted(n); for(int i=0; i<n; ++i) { std::cin >> h[i]; h_sorted[i] = {h[i], i}; } std::sort(h_sorted.begin(), h_sorted.end()); for(int i=0; i<n; ++i) { perm[i] = h_sorted[i].second; // perm[h_sorted[i].second] = i; } std::vector<bool> w_cyklu(n); std::vector<std::queue<int>> cykle; for(int i=0; i<n; ++i) { if(w_cyklu[i]) continue; std::queue<int> q; int a=i; do { q.push(a); w_cyklu[a] = true; a = perm[a]; } while(a!=i); cykle.push_back(q); } for(int i=0; i<cykle.size(); ++i) { ustal_zmiany(cykle[i], 0); } std::cout<<zmiany.size()<<'\n'; for(int i=0; i<zmiany.size(); ++i) { std::cout<<zmiany[i].size()*2<<'\n'; for(int j=0; j<zmiany[i].size(); ++j) { std::cout<<zmiany[i][j].first+1<<' '; } for(int j=zmiany[i].size()-1; j>=0; --j) { std::cout<<zmiany[i][j].second+1<<' '; } std::cout<<'\n'; } return 0; } |
English