//Jakub Nowak XIV LO Wroclaw
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 3007;
int n;//1<=n<=3000
int H[N], P[N];
vector<deque<int>> O;//Odpowiedz
bool cmp(int a, int b) {
return H[a]<H[b];
}
bool gotowe() {
for(int i=1; i<=n; i++) if(P[i]!=i) return false;
return true;
}
void dodaj_pare(int a, int b, deque<int> &Q) {
swap(P[a],P[b]);
Q.push_front(a);
Q.push_back(b);
}
deque<int> ruch() {
deque<int> Q;
bool bylo[n+1];
for(int i=0; i<=n; i++) bylo[i]=0;//bylo[i] = czy przeszlismy juz przez i-ta komurke
for(int i=1; i<=n; i++) {
if(bylo[i]) continue;
vector<int> C={i};//cykl
for(int j=P[i]; j!=i; j=P[j]) C.pb(j);//znajdowanie cyklu
//-------------ogarnianie cyklu--------------
for(auto u:C) bylo[u]=1;
if(C.size()%2==1) C.pop_back();//odrzucenie niepotrzebnego
for(int j=0; j<C.size()/2; j++) {//przejscie po parach
dodaj_pare(C[j], C[C.size()-1-j], Q);
}
//-------------------------------------------
}
return Q;
}
void wypisz_P() {
cout<<"\nP: ";
for(int i=1; i<=n; i++) cout<<P[i]<<" ";
cout<<"\n";
}
void rev() {
int P2[n+1];
for(int i=1; i<=n; i++) P2[P[i]]=i;
for(int i=1; i<=n; i++) P[i]=P2[i];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1; i<=n; i++) P[i]=i;
for(int i=1; i<=n; i++) cin>>H[i];
//wypisz_P();
sort(P+1, P+n+1, cmp);
rev();
while(!gotowe()) {
O.pb(ruch());
}
//--------------wypisywanie--------------
cout<<O.size()<<"\n";
for(auto Q:O) {
cout<<Q.size()<<"\n";
for(auto u:Q) cout<<u<<" ";
cout<<"\n";
}
}
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 | //Jakub Nowak XIV LO Wroclaw #include<bits/stdc++.h> using namespace std; #define pb push_back const int N = 3007; int n;//1<=n<=3000 int H[N], P[N]; vector<deque<int>> O;//Odpowiedz bool cmp(int a, int b) { return H[a]<H[b]; } bool gotowe() { for(int i=1; i<=n; i++) if(P[i]!=i) return false; return true; } void dodaj_pare(int a, int b, deque<int> &Q) { swap(P[a],P[b]); Q.push_front(a); Q.push_back(b); } deque<int> ruch() { deque<int> Q; bool bylo[n+1]; for(int i=0; i<=n; i++) bylo[i]=0;//bylo[i] = czy przeszlismy juz przez i-ta komurke for(int i=1; i<=n; i++) { if(bylo[i]) continue; vector<int> C={i};//cykl for(int j=P[i]; j!=i; j=P[j]) C.pb(j);//znajdowanie cyklu //-------------ogarnianie cyklu-------------- for(auto u:C) bylo[u]=1; if(C.size()%2==1) C.pop_back();//odrzucenie niepotrzebnego for(int j=0; j<C.size()/2; j++) {//przejscie po parach dodaj_pare(C[j], C[C.size()-1-j], Q); } //------------------------------------------- } return Q; } void wypisz_P() { cout<<"\nP: "; for(int i=1; i<=n; i++) cout<<P[i]<<" "; cout<<"\n"; } void rev() { int P2[n+1]; for(int i=1; i<=n; i++) P2[P[i]]=i; for(int i=1; i<=n; i++) P[i]=P2[i]; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1; i<=n; i++) P[i]=i; for(int i=1; i<=n; i++) cin>>H[i]; //wypisz_P(); sort(P+1, P+n+1, cmp); rev(); while(!gotowe()) { O.pb(ruch()); } //--------------wypisywanie-------------- cout<<O.size()<<"\n"; for(auto Q:O) { cout<<Q.size()<<"\n"; for(auto u:Q) cout<<u<<" "; cout<<"\n"; } } |
English