题意:给你一个序列要求排序,每一次可以对一段子序列进行排序,要求最小次数
题解:题意看了很久。。只要和置换群一样把每一个数都找出它所在的循环所有的数就可以了
#include <bits/stdc++.h> #define ll long long #define maxn 100100 using namespace std; struct node{ int b,c,d; }a[maxn]; int dir[maxn]; vector<int >ans[maxn]; int cmp(node aa,node bb){ return aa.b<bb.b; } int cmp1(node aa,node bb){ return aa.c<bb.c; } int main(){ int n,t,num=0; scanf("%d", &n); for(int i=1;i<=n;i++){ scanf("%d", &a[i].b); a[i].c = i; } sort(a+1, a+n+1, cmp); for(int i=1;i<=n;i++) a[i].d = i; sort(a+1, a+n+1, cmp1); for(int i=1;i<=n;i++){ if(dir[i] == 0){ t = i; num++; while(dir[t]==0){ dir[t] = 1; ans[num].push_back(t); t = a[t].d; } } } cout<<num<<endl; for(int i=1;i<=num;i++,puts("")){ cout<<ans[i].size()<<" "; for(int j=0;j<ans[i].size();j++) cout<<ans[i][j]<<" "; } return 0; }