#include <iostream> #include <queue> #include <stack> #include <cmath> using namespace std; priority_queue <pair <int, int> > q1; int t[3004]; int vis[3003][3004]; int vis2[3004]; stack <int> s; queue <int> q; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, a; cin >> n; int licz = n; for (int i = 1; i <= n; i++) { cin >> a; q1.push({a, i}); } while(!q1.empty()){ auto p = q1.top(); q1.pop(); t[p.second] = licz; licz--; } int longest = 1; //for (int i =1; i <=n; i++) cout << t[i]<<" "; for (int i = 1; i <= n; i++) { if (!vis2[i]){ int l = 1; int j = t[i]; vis2[i] = true; while(!vis2[j]){ vis2[j] = true; j = t[j]; l++; } if (l > longest) longest=l; } } int lg = log2(longest); if ((1 << lg) != longest) lg++; cout << lg << "\n"; for (licz = 0; licz < lg; licz++) { for (int i = 1; i <= n; i++) { if (t[i] != i && !vis[licz][i]){ if (!vis[licz][t[i]]){ int j = i; while(!vis[licz][j] && !vis[licz][t[j]]){ q.push(j); s.push(t[j]); vis[licz][j] = true; vis[licz][t[j]] = true; swap(t[j], t[t[j]]); j = t[j]; } } } } cout << q.size() + s.size() << "\n"; while (!q.empty()){ cout << q.front() << " "; q.pop(); } while (!s.empty()){ cout << s.top() << " "; s.pop(); } cout << "\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 | #include <iostream> #include <queue> #include <stack> #include <cmath> using namespace std; priority_queue <pair <int, int> > q1; int t[3004]; int vis[3003][3004]; int vis2[3004]; stack <int> s; queue <int> q; int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n, a; cin >> n; int licz = n; for (int i = 1; i <= n; i++) { cin >> a; q1.push({a, i}); } while(!q1.empty()){ auto p = q1.top(); q1.pop(); t[p.second] = licz; licz--; } int longest = 1; //for (int i =1; i <=n; i++) cout << t[i]<<" "; for (int i = 1; i <= n; i++) { if (!vis2[i]){ int l = 1; int j = t[i]; vis2[i] = true; while(!vis2[j]){ vis2[j] = true; j = t[j]; l++; } if (l > longest) longest=l; } } int lg = log2(longest); if ((1 << lg) != longest) lg++; cout << lg << "\n"; for (licz = 0; licz < lg; licz++) { for (int i = 1; i <= n; i++) { if (t[i] != i && !vis[licz][i]){ if (!vis[licz][t[i]]){ int j = i; while(!vis[licz][j] && !vis[licz][t[j]]){ q.push(j); s.push(t[j]); vis[licz][j] = true; vis[licz][t[j]] = true; swap(t[j], t[t[j]]); j = t[j]; } } } } cout << q.size() + s.size() << "\n"; while (!q.empty()){ cout << q.front() << " "; q.pop(); } while (!s.empty()){ cout << s.top() << " "; s.pop(); } cout << "\n"; } return 0; } |