#include<bits/stdc++.h> using namespace std; int n; int l[3010]; struct struktura{ int val; int nast; int prev; }; struktura h[3010]; void czytaj(queue<int> &pierw, stack<int> &drug){ cout<<pierw.size() + drug.size()<<endl; while(!pierw.empty()){ cout<<pierw.front()<<" "; pierw.pop(); } while(!drug.empty()){ cout<<drug.top()<<" "; drug.pop(); } cout<<endl; } bool jeden(bool pierwszy){ queue<int> pierw; stack<int> drug; for(int i=1;i<=n;i++){ if(h[i].nast == i)continue; else if(h[h[i].nast].nast == i){ if(h[i].nast > i){ pierw.push(i); drug.push(h[i].nast); } continue; } else return false; } if(pierwszy)cout<<1<<endl; czytaj(pierw, drug); return true; } int poprz(int ind){ for(int i=1;i<=n;i++){ if(h[i].nast == ind)return i; } return 0; } bool zero(){ for(int i=1;i<n;i++){ if(h[i].val>h[i+1].val)return false; } cout<<0<<endl; return true; } void drugi(){ queue<int> pierw; stack<int> drug; int akt; for(int i=1;i<=n;i++){ akt = i; while(akt != h[h[akt].nast].nast && h[akt].nast != akt){ pierw.push(h[akt].nast); drug.push(h[akt].prev); int x = h[akt].prev; swap(h[h[akt].prev].nast, h[h[akt].nast].nast); swap(h[h[akt].prev].val, h[h[akt].nast].val); akt = x; } } cout<<2<<endl; czytaj(pierw, drug); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>h[i].val; l[i] = h[i].val; } sort(l+1, l+n+1); for(int i=1;i<=n;i++){ int a = upper_bound(l+1, l+n+1, h[i].val) - l - 1; h[i].nast = a; h[a].prev = i; } if(zero())return 0; if(jeden(true))return 0; drugi(); jeden(false); 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 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 | #include<bits/stdc++.h> using namespace std; int n; int l[3010]; struct struktura{ int val; int nast; int prev; }; struktura h[3010]; void czytaj(queue<int> &pierw, stack<int> &drug){ cout<<pierw.size() + drug.size()<<endl; while(!pierw.empty()){ cout<<pierw.front()<<" "; pierw.pop(); } while(!drug.empty()){ cout<<drug.top()<<" "; drug.pop(); } cout<<endl; } bool jeden(bool pierwszy){ queue<int> pierw; stack<int> drug; for(int i=1;i<=n;i++){ if(h[i].nast == i)continue; else if(h[h[i].nast].nast == i){ if(h[i].nast > i){ pierw.push(i); drug.push(h[i].nast); } continue; } else return false; } if(pierwszy)cout<<1<<endl; czytaj(pierw, drug); return true; } int poprz(int ind){ for(int i=1;i<=n;i++){ if(h[i].nast == ind)return i; } return 0; } bool zero(){ for(int i=1;i<n;i++){ if(h[i].val>h[i+1].val)return false; } cout<<0<<endl; return true; } void drugi(){ queue<int> pierw; stack<int> drug; int akt; for(int i=1;i<=n;i++){ akt = i; while(akt != h[h[akt].nast].nast && h[akt].nast != akt){ pierw.push(h[akt].nast); drug.push(h[akt].prev); int x = h[akt].prev; swap(h[h[akt].prev].nast, h[h[akt].nast].nast); swap(h[h[akt].prev].val, h[h[akt].nast].val); akt = x; } } cout<<2<<endl; czytaj(pierw, drug); } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++){ cin>>h[i].val; l[i] = h[i].val; } sort(l+1, l+n+1); for(int i=1;i<=n;i++){ int a = upper_bound(l+1, l+n+1, h[i].val) - l - 1; h[i].nast = a; h[a].prev = i; } if(zero())return 0; if(jeden(true))return 0; drugi(); jeden(false); return 0; } |