#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdint>
#include <deque>
using namespace std;
int main()
{
int n;
cin>>n;
vector<pair<int, int>> a;
for (int i=0; i<n;i++){
int w;
cin>>w;
a.push_back(make_pair(w,i));
}
sort(begin(a), end(a));
vector<int> sortperm(n);
for (int i=0; i<n;i++){
sortperm[a[i].second]=i;
}
vector<uint8_t> odhaczone(n,0);
vector<int> cykl;
cykl.reserve(n);
deque<int> rev1, rev2;
for (int j=0; j<n; j++){
if (!odhaczone[j]){//szukamy nowego cyklu
int i=j;
odhaczone[i]=1;
cykl.clear();
cykl.push_back(i);
while (sortperm[i]!=j){
i=sortperm[i];
cykl.push_back(i);
odhaczone[i]=1;
}//permutacja w kieszeni
int b=0, e=cykl.size()-1;
while (b<e){
rev1.push_front(cykl[b++]+1);
rev1.push_back(cykl[e--]+1);
}
b=1, e=cykl.size()-1;
while (b<e){
rev2.push_front(cykl[b++]+1);
rev2.push_back(cykl[e--]+1);
}
}
}
cout<<(!rev1.empty())+(int)(!rev2.empty())<<endl;
if (!rev1.empty()){
cout<<rev1.size()<<endl;
copy (begin(rev1),end(rev1),ostream_iterator<int>(cout, " ") );
cout<<endl;
}
if (!rev2.empty()){
cout<<rev2.size()<<endl;
copy (begin(rev2),end(rev2),ostream_iterator<int>(cout, " ") );
cout<<endl;
}
// for (int i=0; i<n;i++){
// a[i].first=a[i].second;
// a[i].second = i;
// }
// sort(begin(a), end(a));
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 83 84 85 86 | #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cstdint> #include <deque> using namespace std; int main() { int n; cin>>n; vector<pair<int, int>> a; for (int i=0; i<n;i++){ int w; cin>>w; a.push_back(make_pair(w,i)); } sort(begin(a), end(a)); vector<int> sortperm(n); for (int i=0; i<n;i++){ sortperm[a[i].second]=i; } vector<uint8_t> odhaczone(n,0); vector<int> cykl; cykl.reserve(n); deque<int> rev1, rev2; for (int j=0; j<n; j++){ if (!odhaczone[j]){//szukamy nowego cyklu int i=j; odhaczone[i]=1; cykl.clear(); cykl.push_back(i); while (sortperm[i]!=j){ i=sortperm[i]; cykl.push_back(i); odhaczone[i]=1; }//permutacja w kieszeni int b=0, e=cykl.size()-1; while (b<e){ rev1.push_front(cykl[b++]+1); rev1.push_back(cykl[e--]+1); } b=1, e=cykl.size()-1; while (b<e){ rev2.push_front(cykl[b++]+1); rev2.push_back(cykl[e--]+1); } } } cout<<(!rev1.empty())+(int)(!rev2.empty())<<endl; if (!rev1.empty()){ cout<<rev1.size()<<endl; copy (begin(rev1),end(rev1),ostream_iterator<int>(cout, " ") ); cout<<endl; } if (!rev2.empty()){ cout<<rev2.size()<<endl; copy (begin(rev2),end(rev2),ostream_iterator<int>(cout, " ") ); cout<<endl; } // for (int i=0; i<n;i++){ // a[i].first=a[i].second; // a[i].second = i; // } // sort(begin(a), end(a)); return 0; } |
English