#include <iostream> #include <map> #include <vector> #include <algorithm> using namespace std; void transform(std::vector<int> &vec) { std::vector<int> copy = vec; std::sort(copy.begin(), copy.end()); std::map<int, int> pos; for (int i=0; i<copy.size(); i++) { pos[copy.at(i)] = i; } for (int i=1; i<copy.size(); i++) { vec[i] = pos[vec[i]]; } } std::vector<std::vector<int>> cycles(std::vector<int> &vec) { std::vector<std::vector<int>> cycles; std::vector<bool> visited(vec.size(), false); for (int i=1; i<vec.size(); i++) { if (visited[i]) { continue; } std::vector<int> cycle; cycle.push_back(i); visited[i] = true; int next = vec[i]; while (next != i) { visited[next] = true; cycle.push_back(next); next = vec[next]; } if (cycle.size() != 1) { cycles.push_back(cycle); } } return cycles; } void break_cycles(std::vector<std::vector<int>> &cycles, std::vector<int> &vec) { std::vector<int> first; std::vector<int> second; for (auto cycle : cycles) { if (cycle.size() == 2) { first.push_back(cycle[0]); second.push_back(cycle[1]); continue; } for (int i=0; i<(cycle.size()-1)/2; i++) { first.push_back(cycle[i]); second.push_back(cycle[cycle.size()-2-i]); } } std::map<int, int> pos; for (int i=0; i<vec.size(); i++) { pos[vec.at(i)] = i; } for (int i=0; i<first.size(); i++) { int f = first[i]; int s = second[i]; vec[pos[f]] = s; vec[pos[s]] = f; //std::cout << "swap " << f << " " << s << '\n'; } reverse(second.begin(), second.end()); first.insert(first.end(), second.begin(), second.end()); std::cout << first.size() << '\n'; for (int v : first) { std::cout << pos[v] << " "; } std::cout << '\n'; } int main() { ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::vector<int> vec; std::cin >> n; vec.push_back(0); for (int i=0; i<n; i++) { int v; std::cin >> v; vec.push_back(v); } std::vector<int> res; transform(vec); // for (int v: vec) { // std::cout << v << " "; // } // std::cout << '\n'; std::vector<std::vector<int>> c = cycles(vec); // for (std::vector<int> cycle : c) { // for (int v: cycle) { // std::cout << v << " "; // } // std::cout << '\n'; // } if (c.size() == 0) { std::cout << "0\n"; return 0; } bool only_len_2 = true; for (auto v : c) { if (v.size() > 2) { only_len_2 = false; } } if (only_len_2) { std::cout << "1\n"; break_cycles(c, vec); return 0; } else { std::cout << "2\n"; break_cycles(c, vec); std::vector<std::vector<int>> c = cycles(vec); // for (int v: vec) { // std::cout << v << " "; // } // std::cout << '\n'; // for (std::vector<int> cycle : c) { // std::cout << "["; // for (int v: cycle) { // std::cout << v << " "; // } // std::cout << "]\n"; // } break_cycles(c, vec); } // for (int v: vec) { // std::cout << v << " "; // } }
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 157 158 | #include <iostream> #include <map> #include <vector> #include <algorithm> using namespace std; void transform(std::vector<int> &vec) { std::vector<int> copy = vec; std::sort(copy.begin(), copy.end()); std::map<int, int> pos; for (int i=0; i<copy.size(); i++) { pos[copy.at(i)] = i; } for (int i=1; i<copy.size(); i++) { vec[i] = pos[vec[i]]; } } std::vector<std::vector<int>> cycles(std::vector<int> &vec) { std::vector<std::vector<int>> cycles; std::vector<bool> visited(vec.size(), false); for (int i=1; i<vec.size(); i++) { if (visited[i]) { continue; } std::vector<int> cycle; cycle.push_back(i); visited[i] = true; int next = vec[i]; while (next != i) { visited[next] = true; cycle.push_back(next); next = vec[next]; } if (cycle.size() != 1) { cycles.push_back(cycle); } } return cycles; } void break_cycles(std::vector<std::vector<int>> &cycles, std::vector<int> &vec) { std::vector<int> first; std::vector<int> second; for (auto cycle : cycles) { if (cycle.size() == 2) { first.push_back(cycle[0]); second.push_back(cycle[1]); continue; } for (int i=0; i<(cycle.size()-1)/2; i++) { first.push_back(cycle[i]); second.push_back(cycle[cycle.size()-2-i]); } } std::map<int, int> pos; for (int i=0; i<vec.size(); i++) { pos[vec.at(i)] = i; } for (int i=0; i<first.size(); i++) { int f = first[i]; int s = second[i]; vec[pos[f]] = s; vec[pos[s]] = f; //std::cout << "swap " << f << " " << s << '\n'; } reverse(second.begin(), second.end()); first.insert(first.end(), second.begin(), second.end()); std::cout << first.size() << '\n'; for (int v : first) { std::cout << pos[v] << " "; } std::cout << '\n'; } int main() { ios_base::sync_with_stdio(false); std::cin.tie(NULL); int n; std::vector<int> vec; std::cin >> n; vec.push_back(0); for (int i=0; i<n; i++) { int v; std::cin >> v; vec.push_back(v); } std::vector<int> res; transform(vec); // for (int v: vec) { // std::cout << v << " "; // } // std::cout << '\n'; std::vector<std::vector<int>> c = cycles(vec); // for (std::vector<int> cycle : c) { // for (int v: cycle) { // std::cout << v << " "; // } // std::cout << '\n'; // } if (c.size() == 0) { std::cout << "0\n"; return 0; } bool only_len_2 = true; for (auto v : c) { if (v.size() > 2) { only_len_2 = false; } } if (only_len_2) { std::cout << "1\n"; break_cycles(c, vec); return 0; } else { std::cout << "2\n"; break_cycles(c, vec); std::vector<std::vector<int>> c = cycles(vec); // for (int v: vec) { // std::cout << v << " "; // } // std::cout << '\n'; // for (std::vector<int> cycle : c) { // std::cout << "["; // for (int v: cycle) { // std::cout << v << " "; // } // std::cout << "]\n"; // } break_cycles(c, vec); } // for (int v: vec) { // std::cout << v << " "; // } } |