#include "bits/stdc++.h" // Tomasz Nowak using namespace std; // University of Warsaw using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> h(n); for(int &hi : h) cin >> hi; vector<pair<int, int>> sorted(n); REP(i, n) sorted[i] = {h[i], i}; sort(sorted.begin(), sorted.end()); REP(i, n) h[sorted[i].second] = i; debug(n, h); vector<deque<int>> out = {{}, {}}; vector<bool> visited(n, false); REP(start, n) if(not visited[start]) { vector<int> cycle; function<void (int)> dfs = [&](int v) { visited[v] = true; cycle.emplace_back(v); if(not visited[h[v]]) dfs(h[v]); }; dfs(start); debug(cycle); auto add = [&](int lvl, int i, int j) { out[lvl].emplace_back(i); out[lvl].emplace_front(j); swap(h[i], h[j]); }; if(ssize(cycle) == 1) continue; else if(ssize(cycle) == 2) add(0, cycle[0], cycle[1]); else { REP(i, (ssize(cycle) - 1) / 2) add(0, cycle[i], cycle[ssize(cycle) - 2 - i]); REP(i, ssize(cycle) / 2) add(1, cycle[i], cycle[ssize(cycle) - 1 - i]); } debug(h); } while(not out.empty() and out.back().empty()) out.pop_back(); cout << ssize(out) << '\n'; #ifndef LOCAL for(auto ids : out) { cout << ssize(ids) << '\n'; for(int i : ids) cout << i + 1 << ' '; cout << '\n'; } #endif }
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 | #include "bits/stdc++.h" // Tomasz Nowak using namespace std; // University of Warsaw using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> h(n); for(int &hi : h) cin >> hi; vector<pair<int, int>> sorted(n); REP(i, n) sorted[i] = {h[i], i}; sort(sorted.begin(), sorted.end()); REP(i, n) h[sorted[i].second] = i; debug(n, h); vector<deque<int>> out = {{}, {}}; vector<bool> visited(n, false); REP(start, n) if(not visited[start]) { vector<int> cycle; function<void (int)> dfs = [&](int v) { visited[v] = true; cycle.emplace_back(v); if(not visited[h[v]]) dfs(h[v]); }; dfs(start); debug(cycle); auto add = [&](int lvl, int i, int j) { out[lvl].emplace_back(i); out[lvl].emplace_front(j); swap(h[i], h[j]); }; if(ssize(cycle) == 1) continue; else if(ssize(cycle) == 2) add(0, cycle[0], cycle[1]); else { REP(i, (ssize(cycle) - 1) / 2) add(0, cycle[i], cycle[ssize(cycle) - 2 - i]); REP(i, ssize(cycle) / 2) add(1, cycle[i], cycle[ssize(cycle) - 1 - i]); } debug(h); } while(not out.empty() and out.back().empty()) out.pop_back(); cout << ssize(out) << '\n'; #ifndef LOCAL for(auto ids : out) { cout << ssize(ids) << '\n'; for(int i : ids) cout << i + 1 << ' '; cout << '\n'; } #endif } |