zoukankan      html  css  js  c++  java
  • CodeForces

    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.

    Example
    Input
    6
    3 2 1 6 5 4
    Output
    4
    2 1 3
    1 2
    2 4 6
    1 5
    Input
    6
    83 -75 -49 11 37 62
    Output
    1
    6 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.

    题目大意:给你一个乱序的序列,把这些序列中的放入1-k 的集合中,集合具有排序功能,最后将集合1-k中的数依次打印出来是排好序的。问k的最大值是多少?每个集合的大小和集合中的值分别是多少。

    解题思路:对于每一个值都会有排序值后应该在的位置,我们用dfs不停的去找该位置上的值排序之后应该在的位置,对于找过的位置进行标记,把序列中的所有位置dfs一遍就得到了集合中的值。然后这些值我们应该放在优先队列中,省去了排序的环节。其中优先队列应该定义为数组的形式,这样就能够找出k了。如不理解,请看代码:

    AC代码:

     1 #include <iostream>
     2 #include<bits/stdc++.h>
     3 using namespace std;
     4 int a[100005];
     5 struct node
     6 {
     7     int val,id,flag;
     8 } b[100005];
     9 priority_queue<int ,vector<int>,greater<int> > que[100005];
    10 int cmp(const node &a,const node &b)
    11 {
    12     return a.val<b.val;
    13 }
    14 int dfs(int id,int k)
    15 {
    16     que[k].push(id);
    17     if(b[id].flag==0) return 0;
    18     else
    19     {
    20         b[id].flag=0;
    21         dfs(b[id].id,k);
    22     }
    23     return 0;
    24 }
    25 int main()
    26 {
    27     int n;
    28     while(~scanf("%d",&n))
    29     {
    30         for(int i=1; i<=n; i++)
    31         {
    32             scanf("%d",&b[i].val);
    33             b[i].id=i;
    34             b[i].flag=1;
    35         }
    36         sort(b+1,b+n+1,cmp);
    37         int k=0;
    38         for(int i=1;i<=n;i++)
    39         {
    40             if(b[i].flag)
    41             {
    42                 b[i].flag=0;
    43                 dfs(b[i].id,k);
    44                 k++;
    45             }
    46         }
    47         printf("%d
    ",k);
    48         for(int i=0;i<k;i++)
    49         {
    50             printf("%d",que[i].size());
    51             while(!que[i].empty())
    52             {
    53                 printf(" %d",que[i].top());
    54                 que[i].pop();
    55             }
    56             printf("
    ");
    57         }
    58     }
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    解决:npm中 下载速度慢 和(无法将“nrm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次)。
    maven(一) maven到底是个啥玩意~
    Luogu3959 NOIP2017宝藏(状压dp)
    Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)
    Luogu3952 NOIP2017时间复杂度
    BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
    BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
    BZOJ4105 THUSC2015平方运算(线段树)
    BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)
    Luogu3731 HAOI2017新型城市化(二分图匹配+强连通分量)
  • 原文地址:https://www.cnblogs.com/wang-ya-wei/p/7429535.html
Copyright © 2011-2022 走看看