码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4985(模拟)

时间:2016-06-30 21:30:48      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

Little Pony and Permutation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 639    Accepted Submission(s): 342


Problem Description
技术分享

As a unicorn, the ability of using magic is the distinguishing feature among other kind of pony. Being familiar with composition and decomposition is the fundamental course for a young unicorn. Twilight Sparkle is interested in the decomposition of permutations. A permutation of a set S = {1, 2, ..., n} is a bijection from S to itself. In the great magician —— Cauchy‘s two-line notation, one lists the elements of set S in the first row, and then for each element, writes its image under the permutation below it in the second row. For instance, a permutation of set {1, 2, 3, 4, 5} σ can be written as:

技术分享

Here σ(1) = 2, σ(2) = 5, σ(3) = 4, σ(4) = 3, and σ(5) = 1.
Twilight Sparkle is going to decompose the permutation into some disjoint cycles. For instance, the above permutation can be rewritten as:

技术分享

Help Twilight Sparkle find the lexicographic smallest solution. (Only considering numbers).
 

 

Input
Input contains multiple test cases (less than 10). For each test case, the first line contains one number n (1<=n<=10^5). The second line contains n numbers which the i-th of them(start from 1) is σ(i).
 

 

Output
For each case, output the corresponding result.
 

 

Sample Input
5 2 5 4 3 1 3 1 2 3
 

 

Sample Output
(1 2 5)(3 4) (1)(2)(3)
 
= = 把a数组设为bool 型,无限WA。。。我真是。。。本来1A的
题意:就是找循环。比如说 1 ->2 -> 5->1 所以 (1,2,5)是一个循环。
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int N = 100005;
bool vis[N];
int res[N],a[N];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++){
            int j=i;
            if(vis[j]) continue;
            int id = 0;
            while(!vis[j]){
                res[id++] = j;
                vis[j]=true;
                j = a[j];
            }
            printf("(");
            for(int i=0;i<id-1;i++){
                printf("%d ",res[i]);
            }
            printf("%d)",res[id-1]);
        }
        printf("\n");
    }
    return 0;
}

 

hdu 4985(模拟)

标签:

原文地址:http://www.cnblogs.com/liyinggang/p/5631197.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!