#include <stdio.h> #include <vector> #include <unordered_set> #include <unordered_map> #include <algorithm> int n; std::vector<int> m1; void prepare(const std::vector<int>& v) { auto sorted = v; std::unordered_map<int, int> pos; m1.resize(n); for(auto i =0 ;i<v.size();i++) pos[v[i]]= i; std::sort(sorted.begin(), sorted.end()); for(int i =0;i<sorted.size();i++) { m1[i] = pos[sorted[i]]; } } int cykl[3500]={}; int main() { scanf("%d",&n); std::vector<int> v(n); for(int i =0;i<n;i++) scanf("%d",&v[i]); prepare(v); std::vector<std::vector<int>> cykle; int curCykl = 1; for(int i =0;i<n;i++) { std::vector<int> tmp; auto cur = i; while(cykl[cur] == 0) { tmp.push_back(cur); cykl[cur] = curCykl; cur = m1[cur]; } if(tmp.size() > 0) { cykle.push_back(tmp); curCykl++; } } std::vector<std::vector<int>> res; /* for(int i =0;i<cykle.size();i++) { printf("CYKL "); for(int j=0;j<cykle[i].size();j++) printf("%d ", cykle[i][j]); printf("\n"); }*/ while(1) { bool ok = true; std::vector<int> b, e; std::vector<int> round; for(int i=0;i<cykle.size();i++) { if(cykle[i].size() <= 1) { continue; } ok = false; std::vector<int> tmp; for(int j=0;j<cykle[i].size();j+=2) { if(j+1 < cykle[i].size()) { b.push_back(cykle[i][j]); e.push_back(cykle[i][j+1]); tmp.push_back(cykle[i][j+1]); std::swap(v[cykle[i][j]] ,v[cykle[i][j+1]]); } else { tmp.push_back(cykle[i][j]); } } cykle[i] = tmp; } if(ok) break; for(int i =0;i<b.size(); i++) round.push_back(b[i]+1); for(int i =e.size()-1;i>=0;i--) round.push_back(e[i]+1); res.push_back(round); } printf("%d\n",res.size()); for(int i=0;i<res.size();i++) { printf("%d\n",res[i].size()); for(const auto&x : res[i]) printf("%d ",x); printf("\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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <stdio.h> #include <vector> #include <unordered_set> #include <unordered_map> #include <algorithm> int n; std::vector<int> m1; void prepare(const std::vector<int>& v) { auto sorted = v; std::unordered_map<int, int> pos; m1.resize(n); for(auto i =0 ;i<v.size();i++) pos[v[i]]= i; std::sort(sorted.begin(), sorted.end()); for(int i =0;i<sorted.size();i++) { m1[i] = pos[sorted[i]]; } } int cykl[3500]={}; int main() { scanf("%d",&n); std::vector<int> v(n); for(int i =0;i<n;i++) scanf("%d",&v[i]); prepare(v); std::vector<std::vector<int>> cykle; int curCykl = 1; for(int i =0;i<n;i++) { std::vector<int> tmp; auto cur = i; while(cykl[cur] == 0) { tmp.push_back(cur); cykl[cur] = curCykl; cur = m1[cur]; } if(tmp.size() > 0) { cykle.push_back(tmp); curCykl++; } } std::vector<std::vector<int>> res; /* for(int i =0;i<cykle.size();i++) { printf("CYKL "); for(int j=0;j<cykle[i].size();j++) printf("%d ", cykle[i][j]); printf("\n"); }*/ while(1) { bool ok = true; std::vector<int> b, e; std::vector<int> round; for(int i=0;i<cykle.size();i++) { if(cykle[i].size() <= 1) { continue; } ok = false; std::vector<int> tmp; for(int j=0;j<cykle[i].size();j+=2) { if(j+1 < cykle[i].size()) { b.push_back(cykle[i][j]); e.push_back(cykle[i][j+1]); tmp.push_back(cykle[i][j+1]); std::swap(v[cykle[i][j]] ,v[cykle[i][j+1]]); } else { tmp.push_back(cykle[i][j]); } } cykle[i] = tmp; } if(ok) break; for(int i =0;i<b.size(); i++) round.push_back(b[i]+1); for(int i =e.size()-1;i>=0;i--) round.push_back(e[i]+1); res.push_back(round); } printf("%d\n",res.size()); for(int i=0;i<res.size();i++) { printf("%d\n",res[i].size()); for(const auto&x : res[i]) printf("%d ",x); printf("\n"); } return 0; } |