#include <bits/stdc++.h> using namespace std; vector<int> h; bool gr(int &i, int &j) { return h[i] < h[j]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> a(n); h.resize(n); for (int i = 0; i < n; i++) { cin >> h[i]; a[i] = i; } sort(a.begin(), a.end(), gr); vector<int> b(n); for (int i = 0; i < n; i++) b[a[i]] = i; a = b; vector<bool> vis(n, 0); vector<vector<int>> cycles; int maxi = 0; for (int i = 0; i < n; i++) { if (!vis[i]) { vis[i] = 1; cycles.push_back({i}); int nxt = a[i]; while (!vis[nxt]) { cycles.back().push_back(nxt); vis[nxt] = 1; nxt = a[nxt]; } } } for (auto c : cycles) { maxi = max(maxi, (int)c.size()); } if (maxi == 1) { cout << 0 << '\n'; return 0; } vector<vector<int>> frw(2); vector<vector<int>> bck(2); for (auto c : cycles) { if (c.size() == 2) { frw[0].push_back(c[0]); bck[0].push_back(c[1]); } else if (c.size() > 2) { if (c.size() % 2 == 0) { for (int i = 0; i < c.size() / 2 - 1; i++) { frw[0].push_back(c[i]); bck[0].push_back(c[c.size() - 2 - i]); } { for (int i = 0; i < c.size() / 2; i++) { frw[1].push_back(c[i]); bck[1].push_back(c[c.size() - 1 - i]); } } } else{ for (int i = 0; i < c.size() / 2; i++) { frw[0].push_back(c[i]); bck[0].push_back(c[c.size() - 2 - i]); } { for (int i = 0; i < c.size() / 2; i++) { frw[1].push_back(c[i]); bck[1].push_back(c[c.size() - 1 - i]); } } } } } if(frw[1].empty()) { cout << 1 << '\n'; cout << frw[0].size() + bck[0].size() << '\n'; reverse(frw[0].begin(), frw[0].end()); for (auto x : frw[0]) cout << x + 1 << ' '; for (auto x : bck[0]) cout << x + 1 << ' '; cout << '\n'; } else { cout << 2 << '\n'; for (int i = 0; i < 2; i++) { cout << frw[i].size() + bck[i].size() << '\n'; reverse(frw[i].begin(), frw[i].end()); for (auto x : frw[i]) cout << x + 1 << ' '; for (auto x : bck[i]) cout << x + 1 << ' '; cout << '\n'; } } // for (int i = 0; i < 2; i++) // { // for (int j = 0; j < frw[i].size(); j++) // swap(h[frw[i][frw[i].size() - 1 - j]], h[bck[i][j]]); // } // for (int i = 1; i < n; i++) // { // if (h[i - 1] > h[i]) // { // cout << "ZLE!\n"; // break; // } // } // for (int i = 0; i < n; i++) // cout << a[i] +1 << ' '; // cout<<'\n'; // for(auto c : cycles) // { // for (auto x : c) // { // cout << x + 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | #include <bits/stdc++.h> using namespace std; vector<int> h; bool gr(int &i, int &j) { return h[i] < h[j]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector<int> a(n); h.resize(n); for (int i = 0; i < n; i++) { cin >> h[i]; a[i] = i; } sort(a.begin(), a.end(), gr); vector<int> b(n); for (int i = 0; i < n; i++) b[a[i]] = i; a = b; vector<bool> vis(n, 0); vector<vector<int>> cycles; int maxi = 0; for (int i = 0; i < n; i++) { if (!vis[i]) { vis[i] = 1; cycles.push_back({i}); int nxt = a[i]; while (!vis[nxt]) { cycles.back().push_back(nxt); vis[nxt] = 1; nxt = a[nxt]; } } } for (auto c : cycles) { maxi = max(maxi, (int)c.size()); } if (maxi == 1) { cout << 0 << '\n'; return 0; } vector<vector<int>> frw(2); vector<vector<int>> bck(2); for (auto c : cycles) { if (c.size() == 2) { frw[0].push_back(c[0]); bck[0].push_back(c[1]); } else if (c.size() > 2) { if (c.size() % 2 == 0) { for (int i = 0; i < c.size() / 2 - 1; i++) { frw[0].push_back(c[i]); bck[0].push_back(c[c.size() - 2 - i]); } { for (int i = 0; i < c.size() / 2; i++) { frw[1].push_back(c[i]); bck[1].push_back(c[c.size() - 1 - i]); } } } else{ for (int i = 0; i < c.size() / 2; i++) { frw[0].push_back(c[i]); bck[0].push_back(c[c.size() - 2 - i]); } { for (int i = 0; i < c.size() / 2; i++) { frw[1].push_back(c[i]); bck[1].push_back(c[c.size() - 1 - i]); } } } } } if(frw[1].empty()) { cout << 1 << '\n'; cout << frw[0].size() + bck[0].size() << '\n'; reverse(frw[0].begin(), frw[0].end()); for (auto x : frw[0]) cout << x + 1 << ' '; for (auto x : bck[0]) cout << x + 1 << ' '; cout << '\n'; } else { cout << 2 << '\n'; for (int i = 0; i < 2; i++) { cout << frw[i].size() + bck[i].size() << '\n'; reverse(frw[i].begin(), frw[i].end()); for (auto x : frw[i]) cout << x + 1 << ' '; for (auto x : bck[i]) cout << x + 1 << ' '; cout << '\n'; } } // for (int i = 0; i < 2; i++) // { // for (int j = 0; j < frw[i].size(); j++) // swap(h[frw[i][frw[i].size() - 1 - j]], h[bck[i][j]]); // } // for (int i = 1; i < n; i++) // { // if (h[i - 1] > h[i]) // { // cout << "ZLE!\n"; // break; // } // } // for (int i = 0; i < n; i++) // cout << a[i] +1 << ' '; // cout<<'\n'; // for(auto c : cycles) // { // for (auto x : c) // { // cout << x + 1 << ' '; // } // cout << '\n'; // } } |