#include<cstdio> #include<vector> #include<algorithm> #include<map> #include<utility> using namespace std; int main() { int graduatesNum; scanf("%d\n", &graduatesNum); vector<int> heights(graduatesNum); vector<int> sortedHeights(graduatesNum); for (int i = 0; i < graduatesNum; i++) { scanf("%d\n", &heights[i]); sortedHeights[i] = heights[i]; } sort(sortedHeights.begin(), sortedHeights.end()); map<int, int> targetIxs; for (int i = 0; i < graduatesNum; i++) { targetIxs[sortedHeights[i]] = i; } vector<bool> processed(graduatesNum, false); vector<vector<pair<int, int> > > swaps; for (int i = 0; i < graduatesNum; i++) { if (!processed[i]) { vector<int> cycle; int startHeight = heights[i]; cycle.push_back(i); processed[i] = true; int j = targetIxs[startHeight]; while (j != i) { cycle.push_back(j); processed[j] = true; j = targetIxs[heights[j]]; } bool added = true; int range = 1; int turn = 0; while (added) { added = false; int k = 0; int first = -1; while (k < cycle.size()) { if (first == -1) { first = cycle[k]; } else { while (turn >= swaps.size()) { vector<pair<int, int> > layer; swaps.push_back(layer); } pair<int, int> swapPair(first, cycle[k]); swaps[turn].push_back(swapPair); added = true; first = -1; } k += range; } range *= 2; turn++; } } } printf("%lu\n", swaps.size()); for (int i = 0; i < swaps.size(); i++) { printf("%lu\n", swaps[i].size() * 2); for (int j = 0; j < swaps[i].size(); j++) { printf("%d ", swaps[i][j].first + 1); } for (int j = swaps[i].size() - 1; j > 0; j--) { printf("%d ", swaps[i][j].second + 1); } printf("%d\n", swaps[i][0].second + 1); } }
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 | #include<cstdio> #include<vector> #include<algorithm> #include<map> #include<utility> using namespace std; int main() { int graduatesNum; scanf("%d\n", &graduatesNum); vector<int> heights(graduatesNum); vector<int> sortedHeights(graduatesNum); for (int i = 0; i < graduatesNum; i++) { scanf("%d\n", &heights[i]); sortedHeights[i] = heights[i]; } sort(sortedHeights.begin(), sortedHeights.end()); map<int, int> targetIxs; for (int i = 0; i < graduatesNum; i++) { targetIxs[sortedHeights[i]] = i; } vector<bool> processed(graduatesNum, false); vector<vector<pair<int, int> > > swaps; for (int i = 0; i < graduatesNum; i++) { if (!processed[i]) { vector<int> cycle; int startHeight = heights[i]; cycle.push_back(i); processed[i] = true; int j = targetIxs[startHeight]; while (j != i) { cycle.push_back(j); processed[j] = true; j = targetIxs[heights[j]]; } bool added = true; int range = 1; int turn = 0; while (added) { added = false; int k = 0; int first = -1; while (k < cycle.size()) { if (first == -1) { first = cycle[k]; } else { while (turn >= swaps.size()) { vector<pair<int, int> > layer; swaps.push_back(layer); } pair<int, int> swapPair(first, cycle[k]); swaps[turn].push_back(swapPair); added = true; first = -1; } k += range; } range *= 2; turn++; } } } printf("%lu\n", swaps.size()); for (int i = 0; i < swaps.size(); i++) { printf("%lu\n", swaps[i].size() * 2); for (int j = 0; j < swaps[i].size(); j++) { printf("%d ", swaps[i][j].first + 1); } for (int j = swaps[i].size() - 1; j > 0; j--) { printf("%d ", swaps[i][j].second + 1); } printf("%d\n", swaps[i][0].second + 1); } } |