#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define L long long
#define MP make_pair
#define REP(i, n) for(int i = 0; i < n; ++i)
#define REPR(i, n) for(int i = n - 1; i >= 0; --i)
#define FOR(i, a, b) for(int i = a; i < b; ++i)
#define FORR(i, a, b) for(int i = b - 1; i >= a; --i)
#define EB emplace_back
#define ST first
#define ND second
#define S size
#define RS resize
template<class T> using P = pair<T, T>;
template<class T> using V = vector<T>;
bool is_sorted(V<int>& v) {
REP(i, (int)v.size() - 1) {
if (v[i] >= v[i + 1]) {
return false;
}
}
return true;
}
V<int> scale(V<int>& v) {
V<int> res;
for (int x : v) {
int c = 0;
for (int y : v) {
if (y < x) {
c++;
}
}
res.EB(c);
}
return res;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
V<int> h(n);
REP(i, n) {
cin >> h[i];
}
h = scale(h);
if (is_sorted(h)) {
cout << 0;
return 0;
}
V<V<int>> cycles;
V<bool> vis(n);
REP(i, n) {
if (vis[i]) {
continue;
}
V<int> new_cycle;
int v = i;
while (!vis[v]) {
new_cycle.EB(v);
vis[v] = true;
v = h[v];
}
cycles.EB(new_cycle);
}
V<int> p1, p2, s1, s2;
for (auto& c : cycles) {
int r = (int)c.size();
if (r == 1) {
continue;
}
else if (r == 2) {
p1.EB(c[0]);
s1.EB(c[1]);
}
else {
REP(i, r / 2) {
p1.EB(c[i]);
s1.EB(c[r - i - 1]);
}
REP(i, (r - 1) / 2) {
p2.EB(c[i + 1]);
s2.EB(c[r - i - 1]);
}
}
}
reverse(s1.begin(), s1.end());
reverse(s2.begin(), s2.end());
p1.insert(p1.end(), s1.begin(), s1.end());
p2.insert(p2.end(), s2.begin(), s2.end());
int r1 = (int)p1.size();
int r2 = (int)p2.size();
if (r2 == 0) {
cout << "1\n" << r1 << '\n';
for (int x : p1) {
cout << x + 1 << ' ';
}
}
else {
cout << "2\n" << r1 << '\n';
for (int x : p1) {
cout << x + 1 << ' ';
}
cout << '\n' << r2 << '\n';
for (int x : p2) {
cout << x + 1 << ' ';
}
}
}
// g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG fot.cpp -o fot
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 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size #define RS resize template<class T> using P = pair<T, T>; template<class T> using V = vector<T>; bool is_sorted(V<int>& v) { REP(i, (int)v.size() - 1) { if (v[i] >= v[i + 1]) { return false; } } return true; } V<int> scale(V<int>& v) { V<int> res; for (int x : v) { int c = 0; for (int y : v) { if (y < x) { c++; } } res.EB(c); } return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; V<int> h(n); REP(i, n) { cin >> h[i]; } h = scale(h); if (is_sorted(h)) { cout << 0; return 0; } V<V<int>> cycles; V<bool> vis(n); REP(i, n) { if (vis[i]) { continue; } V<int> new_cycle; int v = i; while (!vis[v]) { new_cycle.EB(v); vis[v] = true; v = h[v]; } cycles.EB(new_cycle); } V<int> p1, p2, s1, s2; for (auto& c : cycles) { int r = (int)c.size(); if (r == 1) { continue; } else if (r == 2) { p1.EB(c[0]); s1.EB(c[1]); } else { REP(i, r / 2) { p1.EB(c[i]); s1.EB(c[r - i - 1]); } REP(i, (r - 1) / 2) { p2.EB(c[i + 1]); s2.EB(c[r - i - 1]); } } } reverse(s1.begin(), s1.end()); reverse(s2.begin(), s2.end()); p1.insert(p1.end(), s1.begin(), s1.end()); p2.insert(p2.end(), s2.begin(), s2.end()); int r1 = (int)p1.size(); int r2 = (int)p2.size(); if (r2 == 0) { cout << "1\n" << r1 << '\n'; for (int x : p1) { cout << x + 1 << ' '; } } else { cout << "2\n" << r1 << '\n'; for (int x : p1) { cout << x + 1 << ' '; } cout << '\n' << r2 << '\n'; for (int x : p2) { cout << x + 1 << ' '; } } } // g++ -std=c++17 -Wall -Wextra -Wshadow -Wconversion -D_GLIBCXX_DEBUG fot.cpp -o fot |
English