#include <stdio.h>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
int tab[3200];
int perm[3200];
int n;
bool wystapil[3200];
bool fix[3200];
vector<vector<int>>res;
set<pair<int,int>> s;
bool sorted()
{
for(int i=1;i<n;i++)
{
if(perm[i]<perm[i-1])return false;
}
return true;
}
int main()
{
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
scanf("%d",tab+i);
s.insert(make_pair(tab[i],i));
}
int i=0;
for(auto a:s)
{
perm[a.second]=i;
i++;
}
/*
printf("perm:\n");
for(int i=0;i<n;i++)
{
printf("%d ",perm[i]);
}
printf("\n");
*/
int l=1;
int r=0;
while(!sorted())
{
vector<int> pocz,kon;
for(int i=0;i<n;i++)
{
int j= perm[i];
if(!fix[i] && !fix[j] && !wystapil[i] && j!=i && !wystapil[j])
{
// printf("i: %d j: %d\n",i,j);
pocz.push_back(i);
kon.push_back(j);
wystapil[i]=true;
wystapil[j]=true;
fix[j]=true;
if(perm[j]==i)fix[i]=true;
}
}
res.push_back(vector<int>());
for(auto a:pocz)res[r].push_back(a);
for(auto i=kon.rbegin();i!=kon.rend();i++)res[r].push_back(*i);
r++;
for(int i=0;i<pocz.size();i++)
{
wystapil[kon[i]]=false;
wystapil[pocz[i]]=false;
int tmp = perm[pocz[i]];
perm[pocz[i]] = perm[kon[i]];
perm[kon[i]] = tmp;
}
}
printf("%d\n",res.size());
for(auto i : res)
{
printf("%d\n",i.size());
for(auto j : i)
{
printf("%d ",j+1);
}
printf("\n");
}
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 | #include <stdio.h> #include <bitset> #include <set> #include <vector> using namespace std; int tab[3200]; int perm[3200]; int n; bool wystapil[3200]; bool fix[3200]; vector<vector<int>>res; set<pair<int,int>> s; bool sorted() { for(int i=1;i<n;i++) { if(perm[i]<perm[i-1])return false; } return true; } int main() { scanf("%d\n",&n); for(int i=0;i<n;i++) { scanf("%d",tab+i); s.insert(make_pair(tab[i],i)); } int i=0; for(auto a:s) { perm[a.second]=i; i++; } /* printf("perm:\n"); for(int i=0;i<n;i++) { printf("%d ",perm[i]); } printf("\n"); */ int l=1; int r=0; while(!sorted()) { vector<int> pocz,kon; for(int i=0;i<n;i++) { int j= perm[i]; if(!fix[i] && !fix[j] && !wystapil[i] && j!=i && !wystapil[j]) { // printf("i: %d j: %d\n",i,j); pocz.push_back(i); kon.push_back(j); wystapil[i]=true; wystapil[j]=true; fix[j]=true; if(perm[j]==i)fix[i]=true; } } res.push_back(vector<int>()); for(auto a:pocz)res[r].push_back(a); for(auto i=kon.rbegin();i!=kon.rend();i++)res[r].push_back(*i); r++; for(int i=0;i<pocz.size();i++) { wystapil[kon[i]]=false; wystapil[pocz[i]]=false; int tmp = perm[pocz[i]]; perm[pocz[i]] = perm[kon[i]]; perm[kon[i]] = tmp; } } printf("%d\n",res.size()); for(auto i : res) { printf("%d\n",i.size()); for(auto j : i) { printf("%d ",j+1); } printf("\n"); } return 0; } |
English