CF 843 A. Sorting by Subsequences

A. Sorting by Subsequences

You are given a sequence a1,?a2,?...,?an consisting of different integers. It is required to split this sequence into the maximum 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 integers a1,?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 subsequence ci (0?<?ci?≤?n), then ci integers l1,?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.

把每一次交换涉及到的元素放到一个集合中。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <cassert>
#include <ctime>
#include <map>
#include <set>
using namespace std;
#define lowbit(x) (x&(-x))
#define max(x,y) (x>=y?x:y)
#define min(x,y) (x<=y?x:y)
#define MAX 100000000000000000
#define MOD 1000000007
#define pi acos(-1.0)
#define ei exp(1)
#define PI 3.141592653589793238462
#define ios() ios::sync_with_stdio(false)
#define INF 1044266558
#define mem(a) (memset(a,0,sizeof(a)))
typedef long long ll;
int a[100005],b[100005],vis[100005];
int ans,n;
set<int>s;
set<int>::iterator it;
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        fill(vis,vis+n,0);
        ans=0;
        for(int i=0;i<n;i++) scanf("%d",&a[i]),b[i]=a[i];
        sort(b,b+n);
        for(int i=0;i<n;i++) a[i]=lower_bound(b,b+n,a[i])-b;
        for(int i=0;i<n;i++)
        {
            if(!vis[i])
            {
                for(int j=a[i];!vis[j];j=a[j]) vis[j]=1;
                ans++;
            }
        }
        printf("%d\n",ans);
        for(int i=0;i<n;i++)
        {
            if(vis[i])
            {
                s.clear();
                for(int j=a[i];vis[j];j=a[j]) s.insert(j+1),vis[j]=0;
                int pos=s.size();
                printf("%d",pos);
                for(it=s.begin();it!=s.end();it++)
                    printf(" %d",*it);
                printf("\n");
            }
        }
    }
    return 0;
}
时间: 2024-08-25 18:16:56

CF 843 A. Sorting by Subsequences的相关文章

cf 843 A Sorting by Subsequences [建图]

题面: 传送门 思路: 这道题乍一看有点难 但是实际上研究一番以后会发现,对于每一个位置只会有一个数要去那里,还有一个数要离开 那么只要把每个数和他将要去的那个位置连起来,构成了一个每个点只有一个入边一个出边的一张图 那么在这张图里的一个环,就代表着一个满足条件的子序列 所以只要把图建出来以后,统计图中的每一个环就可以了 Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #includ

843A - Sorting by Subsequences

843A - Sorting by Subsequences 还好之前了解过一点白书上的permutation! 我写的递归,其实很容易直接写成递推啊 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+10; 4 5 int nex[maxn]; 6 struct Node{ 7 int id,x; 8 bool operator<(const Node &a)const { 9 retu

CodeForces - 844C Sorting by Subsequences (排序+思维)

You are given a sequence a1,?a2,?...,?an consisting of different integers. It is required to split this sequence into the maximum number of subsequences such that after sorting integers in each of them in increasing order, the total sequence also wil

cf 830B - Cards Sorting 树状数组

B. Cards Sorting time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this integer is between 1 and 10

cf 843 B Interactive LowerBound [随机化]

题面: 传送门 思路: 这是一道交互题 比赛的时候我看到了直接跳过了...... 后来后面的题目卡住了就回来看这道题,发现其实比较水 实际上,从整个序列里面随机选1000个数出来询问,然后从里面找出比x小的最大的那个,再往后面搜1000个数(顺序),这样的方法,不成功率是1.7e-9...... 所以随机化就可以了~ (要是这样还WA那真的是脸黑呢......) Code: 1 #include<iostream> 2 #include<cstdio> 3 #include<

AIM Tech Round 4 (Div. 2) A B C

A. Diversity 题意:给出一个字符串,和n,问最多改变多少个字符,使其不同字符最少为n 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 map<char ,int >ma; 7 int main(){ 8 string s; 9 cin>>s; 10 int n; 11 cin>>n; 12 int

AIM Tech Round 4 (Div. 2)(A,暴力,B,组合数,C,STL+排序)

A. Diversity time limit per test:1 second memory limit per test:256 megabytes input:standard input output:standard output Calculate the minimum number of characters you need to change in the string s, so that it contains at least k different letters,

第一周 7.10-7.16

假装自己复活辣. 7.10 CF 689 D Friends and Subsequences 二分. 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 typedef long long LL; 6 const int maxn = 2e5 + 10; 7 int n, a[maxn], b[maxn]; 8 9 // RMQ 10 int

CF 689D - Friends and Subsequences

689D - Friends and Subsequences 题意: 大致跟之前题目一样,用ST表维护a[]区间max,b[]区间min,找出多少对(l,r)使得maxa(l,r) == minb(l,r) 切题的感觉很爽唉 同样而二分查找,找最小和最大下标满足条件 cf中%I64d, 一般是%lld 代码: #include<bits/stdc++.h> #define ll long long const int maxn=200010; int sta[maxn][18]; int s