#include<bits/stdc++.h> using namespace std; int tab[3001],pos[3001], nr[3001] ={0},wyn[3001]; vector<int> cykl; int main() { ios_base::sync_with_stdio(0); int n, i, j, k = 1, ile = 0, dl = 0; cin >> n; for(i = 1; i <= n; i++) { cin >> tab[i]; pos[tab[i]] = 1; } i = 1; for(j = 1; j < 3001; j++) { if(pos[j] == 1) { pos[j] = i; i++; } } for(i = 1; i <= n; i++) { tab[i] = pos[tab[i]]; if(tab[i] == i) nr[i] = 1; } //for(i = 1; i <= n; i++) cout << tab[i] <<" "; cout << endl; for(i = 1; i <= n; i++){ cykl.clear(); cykl.resize(0); if(nr[i] == 0) { int pocz = i; nr[i] = 1; cykl.push_back(i); while(tab[pocz]!= i) { pocz = tab[pocz]; nr[pocz]= 1; cykl.push_back(pocz); } //for(j = 0; j < cykl.size(); j++) cout <<cykl[j] <<" "; cout << endl; for(j = 0; j < cykl.size()/2; j++){ wyn[k] = cykl[j]; wyn[n + 1 - k]= cykl[cykl.size() - 1 - j]; dl += 2; swap(tab[wyn[k]],tab[wyn[n +1 -k]]); k++; } } } for(i = 1; i <= n; i++) { if(tab[i] == i) ile++; } if(dl == 0) { cout << 0 ; return 0; } if(ile == n) cout << 1 << endl; else cout<< 2 << endl; cout << dl << endl; for(i = 1; i <= n; i++) { if(wyn[i] > 0) { cout << wyn[i] <<" "; } wyn[i] = 0; if(tab[i] == i) nr[i] = 1; else nr[i] = 0; } if (ile == n) return 0; dl = 0; k = 1; for(i = 1; i <= n; i++){ cykl.clear(); cykl.resize(0); if(nr[i] == 0) { int pocz = i; nr[i] = 1; cykl.push_back(i); while(tab[pocz]!= i) { pocz = tab[pocz]; nr[pocz]= 1; cykl.push_back(pocz); } //for(j = 0; j < cykl.size(); j++) cout <<cykl[j] <<" "; cout << endl; for(j = 0; j < cykl.size()/2; j++){ wyn[k] = cykl[j]; wyn[n + 1 - k]= cykl[cykl.size() - 1 - j]; dl += 2; swap(tab[wyn[k]],tab[wyn[n +1 -k]]); k++; } } } cout << endl << dl << endl; for(i = 1; i <= n; i++) { if(wyn[i] > 0) cout << wyn[i] <<" "; } 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 | #include<bits/stdc++.h> using namespace std; int tab[3001],pos[3001], nr[3001] ={0},wyn[3001]; vector<int> cykl; int main() { ios_base::sync_with_stdio(0); int n, i, j, k = 1, ile = 0, dl = 0; cin >> n; for(i = 1; i <= n; i++) { cin >> tab[i]; pos[tab[i]] = 1; } i = 1; for(j = 1; j < 3001; j++) { if(pos[j] == 1) { pos[j] = i; i++; } } for(i = 1; i <= n; i++) { tab[i] = pos[tab[i]]; if(tab[i] == i) nr[i] = 1; } //for(i = 1; i <= n; i++) cout << tab[i] <<" "; cout << endl; for(i = 1; i <= n; i++){ cykl.clear(); cykl.resize(0); if(nr[i] == 0) { int pocz = i; nr[i] = 1; cykl.push_back(i); while(tab[pocz]!= i) { pocz = tab[pocz]; nr[pocz]= 1; cykl.push_back(pocz); } //for(j = 0; j < cykl.size(); j++) cout <<cykl[j] <<" "; cout << endl; for(j = 0; j < cykl.size()/2; j++){ wyn[k] = cykl[j]; wyn[n + 1 - k]= cykl[cykl.size() - 1 - j]; dl += 2; swap(tab[wyn[k]],tab[wyn[n +1 -k]]); k++; } } } for(i = 1; i <= n; i++) { if(tab[i] == i) ile++; } if(dl == 0) { cout << 0 ; return 0; } if(ile == n) cout << 1 << endl; else cout<< 2 << endl; cout << dl << endl; for(i = 1; i <= n; i++) { if(wyn[i] > 0) { cout << wyn[i] <<" "; } wyn[i] = 0; if(tab[i] == i) nr[i] = 1; else nr[i] = 0; } if (ile == n) return 0; dl = 0; k = 1; for(i = 1; i <= n; i++){ cykl.clear(); cykl.resize(0); if(nr[i] == 0) { int pocz = i; nr[i] = 1; cykl.push_back(i); while(tab[pocz]!= i) { pocz = tab[pocz]; nr[pocz]= 1; cykl.push_back(pocz); } //for(j = 0; j < cykl.size(); j++) cout <<cykl[j] <<" "; cout << endl; for(j = 0; j < cykl.size()/2; j++){ wyn[k] = cykl[j]; wyn[n + 1 - k]= cykl[cykl.size() - 1 - j]; dl += 2; swap(tab[wyn[k]],tab[wyn[n +1 -k]]); k++; } } } cout << endl << dl << endl; for(i = 1; i <= n; i++) { if(wyn[i] > 0) cout << wyn[i] <<" "; } return 0; } |