题面大意是让你把输入分成一些份 每份可以构成循环 并且总的字典序最小
按题意所说 暴力跑就好 最后排个序
tirck点 题面是有点不严谨的 划分成的每一部分是不能排序输出的
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include<stack>
#include<bitset>
#define inf 0x3f3f3f3f
#define ll long long
#define mod 1000000007
using namespace std;
#define bug puts("bugbugubgbugbug");
int a[100005];
int visit[100005];
vector<int>vv[100005];
int cmp(vector<int >a,vector<int >b)
{
return a[0]<b[0];
}
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(visit,0,sizeof(visit));
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
int l=0;
for(int i=1; i<=n; i++)
if(visit[i]==0)
{
vv[l].push_back(i);
visit[i]=1;
int j=a[i];
while(j!=i)
{
visit[j]=1;
vv[l].push_back(j);
j=a[j];
}
l++;
}
// for(int i=0; i<l; i++)
// sort(vv[i].begin(),vv[i].end());
sort(vv,vv+l,cmp);
for(int i=0; i<l; i++)
{
printf("(");
for(int j=0; j<vv[i].size(); j++)
{
printf("%d",vv[i][j]);
if(j!=vv[i].size()-1)
printf(" ");
}
printf(")");
}
printf("\n");
for(int i=0;i<l;i++)
vv[i].clear();
}
return 0;
}