【CUGBACM15级BC第7场 A】hdu 4985 Little Pony and Permutation

xiaoxiao2021-02-28  92

Little Pony and Permutation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 846    Accepted Submission(s): 444 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)  

题意:

题意较难理解,其实就是一个置换群!

看代码就会理解题意!

#include <iostream> #include <set> #include <map> #include <stack> #include <cmath> #include <queue> #include <cstdio> #include <bitset> #include <string> #include <vector> #include <iomanip> #include <cstring> #include <algorithm> #include <functional> #define PI acos(-1) #define eps 1e-8 #define inf 0x3f3f3f3f #define debug(x) cout<<"---"<<x<<"---"<<endl typedef long long ll; using namespace std; const int N = 100005; int n, a[100010], vis[100010]; int main() { while (scanf("%d", &n) != EOF) { memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); } for (int i = 1; i <= n; i++) { if (vis[i] == 1) { continue; } int gg = i; printf("(%d", gg); vis[gg] = 1; gg = a[gg]; while (vis[gg] == 0) { vis[gg] = 1; printf(" %d", gg); gg = a[gg]; } printf(")"); } printf("\n"); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-54262.html

最新回复(0)