#include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; const int maxx = 3e3+7; map<int,int>mapa; int tab[maxx],bat[maxx]; vector<int>zmiana[maxx]; bool cmp(int a, int b) { return a<b; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for(int i=1; n>=i; i++) { cin>>tab[i]; bat[i] = tab[i]; } sort(tab+1,tab+n+1,cmp); int cnt = 1; for(int i=1; n>=i; i++) { if(!mapa[tab[i]]) { mapa[tab[i]] = cnt; cnt++; } } bool czy[maxx]; int licznik = 0; bool flaga = 1; for(int i=1; n>=i; i++) { if(mapa[bat[i]] != i) flaga = 0; } if(flaga) { cout<<"0"; return 0; } while(true) { fill(czy,czy+maxx,0); for(int i=1; n>=i; i++) { if(!czy[i] and !czy[mapa[bat[i]]] and i != mapa[bat[i]]) { czy[i] = czy[mapa[bat[i]]] = true; zmiana[licznik].push_back(mapa[bat[i]]); zmiana[licznik].push_back(i); swap(bat[i], bat[mapa[bat[i]]]); } } licznik++; flaga = 1; for(int i=1; n>=i; i++) { if(mapa[bat[i]] != i) flaga = 0; } if(flaga) break; } cout<<licznik<<endl; for(int i=0; licznik>i; i++) { cout<<zmiana[i].size()<<endl; vector<int>temp,pmet; temp.clear(); pmet.clear(); for(int j=0; zmiana[i].size()>j; j++) { //cout<<zmiana[i][j]<<" "; if(j%2==0) { temp.push_back(zmiana[i][j]); } else { pmet.push_back(zmiana[i][j]); } } for(int j=0; temp.size()>j; j++) cout<<temp[j]<<" "; for(int j=pmet.size()-1; j>=0; j--) cout<<pmet[j]<<" "; cout<<'\n'; } } /* 5 1670 2011 1560 1232 1447 6 1556 1449 1863 2014 1333 1220 */
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 | #include <iostream> #include <vector> #include <algorithm> #include <map> using namespace std; const int maxx = 3e3+7; map<int,int>mapa; int tab[maxx],bat[maxx]; vector<int>zmiana[maxx]; bool cmp(int a, int b) { return a<b; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for(int i=1; n>=i; i++) { cin>>tab[i]; bat[i] = tab[i]; } sort(tab+1,tab+n+1,cmp); int cnt = 1; for(int i=1; n>=i; i++) { if(!mapa[tab[i]]) { mapa[tab[i]] = cnt; cnt++; } } bool czy[maxx]; int licznik = 0; bool flaga = 1; for(int i=1; n>=i; i++) { if(mapa[bat[i]] != i) flaga = 0; } if(flaga) { cout<<"0"; return 0; } while(true) { fill(czy,czy+maxx,0); for(int i=1; n>=i; i++) { if(!czy[i] and !czy[mapa[bat[i]]] and i != mapa[bat[i]]) { czy[i] = czy[mapa[bat[i]]] = true; zmiana[licznik].push_back(mapa[bat[i]]); zmiana[licznik].push_back(i); swap(bat[i], bat[mapa[bat[i]]]); } } licznik++; flaga = 1; for(int i=1; n>=i; i++) { if(mapa[bat[i]] != i) flaga = 0; } if(flaga) break; } cout<<licznik<<endl; for(int i=0; licznik>i; i++) { cout<<zmiana[i].size()<<endl; vector<int>temp,pmet; temp.clear(); pmet.clear(); for(int j=0; zmiana[i].size()>j; j++) { //cout<<zmiana[i][j]<<" "; if(j%2==0) { temp.push_back(zmiana[i][j]); } else { pmet.push_back(zmiana[i][j]); } } for(int j=0; temp.size()>j; j++) cout<<temp[j]<<" "; for(int j=pmet.size()-1; j>=0; j--) cout<<pmet[j]<<" "; cout<<'\n'; } } /* 5 1670 2011 1560 1232 1447 6 1556 1449 1863 2014 1333 1220 */ |