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