Codeforces 844C Sorting by Subsequences【思维】

来源:互联网 发布:dns默认端口 编辑:程序博客网 时间:2024/06/11 23:52

C. Sorting by Subsequences
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You are given a sequence a1, a2, ..., an consisting ofdifferent integers. It is required to split this sequence into themaximum number of subsequences such that after sorting integers in each of them in increasing order, the total sequence also will be sorted in increasing order.

Sorting integers in a subsequence is a process such that the numbers included in a subsequence are ordered in increasing order, and the numbers which are not included in a subsequence don't change their places.

Every element of the sequence must appear in exactly one subsequence.

Input

The first line of input data contains integer n (1 ≤ n ≤ 105) — the length of the sequence.

The second line of input data contains n different integersa1, a2, ..., an ( - 109 ≤ ai ≤ 109) — the elements of the sequence. It is guaranteed that all elements of the sequence are distinct.

Output

In the first line print the maximum number of subsequences k, which the original sequence can be split into while fulfilling the requirements.

In the next k lines print the description of subsequences in the following format: the number of elements in subsequenceci (0 < ci ≤ n), thenci integersl1, l2, ..., lci (1 ≤ lj ≤ n) — indices of these elements in the original sequence.

Indices could be printed in any order. Every index from 1 to n must appear in output exactly once.

If there are several possible answers, print any of them.

Examples
Input
63 2 1 6 5 4
Output
42 1 31 22 4 61 5
Input
683 -75 -49 11 37 62
Output
16 1 2 3 4 5 6
Note

In the first sample output:

After sorting the first subsequence we will get sequence 1 2 3 6 5 4.

Sorting the second subsequence changes nothing.

After sorting the third subsequence we will get sequence 1 2 3 4 5 6.

Sorting the last subsequence changes nothing.


题目大意:


给出长度为N的一个序列,我们的任务是将其分割成尽可能多的子序列,使得每个子序列自身排序之后,最终的序列是一个递增的序列。

保证每个数只会出现一次。


思路:


首先我们对序列离散化。然后将会得到一个从1~N的一个排列。仔细分析一下不难想到,我们的任务其实就是在找环,对i和a【i】建边,我们只有当一个环内所有元素都分到一个子序列中才行。


Ac代码:

#include<stdio.h>#include<string.h>#include<algorithm>#include<map>#include<math.h>#include<vector>using namespace std;int n;int maxn[250000][21];vector<int>ans[150000];int b[150000];int c[150000];int a[150000];int vis[150000];void Lisanhua(){    int cnt=1;    map<int,int>s;    for(int i=1; i<=n; i++)scanf("%d",&b[i]),c[i]=b[i];    sort(c+1,c+1+n);    for(int i=1; i<=n; i++)    {        if(s[c[i]]==0)s[c[i]]=cnt++;    }    for(int i=1; i<=n; i++)    {        a[i]=s[b[i]];    }}int main(){    while(~scanf("%d",&n))    {        int cnt=0;        Lisanhua();        memset(vis,0,sizeof(vis));        for(int i=1;i<=n;i++)ans[i].clear();        for(int i=1;i<=n;i++)        {            if(vis[i]==0)            {                int x=i;                while(vis[a[x]]==0)                {                    vis[a[x]]=1;                    ans[cnt].push_back(a[x]);                    x=a[x];                }                cnt++;            }        }        printf("%d\n",cnt);        for(int i=0;i<cnt;i++)        {            printf("%d ",ans[i].size());            for(int j=0;j<ans[i].size();j++)            {                printf("%d ",ans[i][j]);            }            printf("\n");        }    }}













原创粉丝点击