#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] << " "; } } } |
English