#include<iostream> #include<vector> #include<cmath> #include<algorithm> using namespace std; bool czy_rosnacy(vector <int> &v){ int a = v.size(); for(int i = 2; i < a;i++){ if(v[i] < v[i-1]){ return false; } } return true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector <int> v(n+1); for(int i = 1; i <= n; i++){ cin >> v[i]; } vector <int> poz(3001); vector <bool> pomWyk(3001, false); vector <bool> wyk; vector <int> pom = v; sort(pom.begin(), pom.end()); for(int i = 1; i <= n; i++){ poz[pom[i]] = i; } vector <vector <int> > wyn; while(czy_rosnacy(v) == false){ vector <int> wynPom; wyk = pomWyk; wyn.push_back(wynPom); for(int i = 1; i <= n; i++){ if(wyk[v[i]] == false && poz[v[i]] != i && wyk[v[poz[v[i]]]] == false){ // czy zostało wykorzystane && czy jest na nie swojej pozycji && czy element na pozycji obencego elementu jest nie wykorzystany //cout << "1: wyimeniam: " << v[i] << " i " << v[poz[v[i]]] << endl; wyn[wyn.size()-1].push_back(i); wyn[wyn.size()-1].push_back(poz[v[i]]); wyk[v[i]] = true; wyk[v[poz[v[i]]]] = true; int pom1 = v[poz[v[i]]]; v[poz[v[i]]] = v[i]; v[i] = pom1; } } } cout << wyn.size(); for(int i = 0; i < wyn.size(); i++){ cout << "\n" << wyn[i].size() << "\n"; for(int j = 0; j < wyn[i].size(); j += 2){ cout << wyn[i][j] << " "; } for(int j = 1; j < wyn[i].size(); j += 2){ cout << wyn[i][wyn[i].size()-j] << " "; } } }
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 | #include<iostream> #include<vector> #include<cmath> #include<algorithm> using namespace std; bool czy_rosnacy(vector <int> &v){ int a = v.size(); for(int i = 2; i < a;i++){ if(v[i] < v[i-1]){ return false; } } return true; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin >> n; vector <int> v(n+1); for(int i = 1; i <= n; i++){ cin >> v[i]; } vector <int> poz(3001); vector <bool> pomWyk(3001, false); vector <bool> wyk; vector <int> pom = v; sort(pom.begin(), pom.end()); for(int i = 1; i <= n; i++){ poz[pom[i]] = i; } vector <vector <int> > wyn; while(czy_rosnacy(v) == false){ vector <int> wynPom; wyk = pomWyk; wyn.push_back(wynPom); for(int i = 1; i <= n; i++){ if(wyk[v[i]] == false && poz[v[i]] != i && wyk[v[poz[v[i]]]] == false){ // czy zostało wykorzystane && czy jest na nie swojej pozycji && czy element na pozycji obencego elementu jest nie wykorzystany //cout << "1: wyimeniam: " << v[i] << " i " << v[poz[v[i]]] << endl; wyn[wyn.size()-1].push_back(i); wyn[wyn.size()-1].push_back(poz[v[i]]); wyk[v[i]] = true; wyk[v[poz[v[i]]]] = true; int pom1 = v[poz[v[i]]]; v[poz[v[i]]] = v[i]; v[i] = pom1; } } } cout << wyn.size(); for(int i = 0; i < wyn.size(); i++){ cout << "\n" << wyn[i].size() << "\n"; for(int j = 0; j < wyn[i].size(); j += 2){ cout << wyn[i][j] << " "; } for(int j = 1; j < wyn[i].size(); j += 2){ cout << wyn[i][wyn[i].size()-j] << " "; } } } |