BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4985
题目意思:有 n 个数,对于第 i 个数给出 σ(i) 的值。求出互不相交的循环的个数,并输出每个循环包含的数字。
还是不太懂吧?反正比赛的时候我也没看懂 >__< !
据说,这条题目用到了置换群 + 循环 的知识,黑书上 P246 有相应介绍。
先来说明下这幅图的意思,搞明白题意就发现这条题是很好做的。

它表示:σ(1) = 2, σ(2) = 5, σ(3) = 4, σ(4) = 3, and σ(5) = 1
首先要知道为什么(1 2 5)和(3 4)要划分开来。我们从数字 1 ~ n 遍历,也就是上面的1 2 3 4 5 啦。那么遍历到 1 的时候,可以输出 1 (设一个vis数组,开始时全部为0,输出后vis[1] = 1),接着取σ(1) 也就是 2 啦,发现之前没有输出过(只输出了 1 而已)那就继续输出 2 啦(vis[2] = 1),接着算出σ(2) = 5,输出5(vis[5] = 1),然后发现 σ(5) = 1,但是vis[1] = 1已经输出过,所以不输出了。此时就发现1 2 5 是一个循环,就是说,通过σ(i)计算它只能在1 2 5 中取数。剩下的3 4 也是通过这样算的。
黑书上有一段是这样介绍循环的:
每个置换都可以写成若干互不相交的循环的乘积,两个循环(a1 a2 ...an) 和 (b1 b2 ...bn) 互不相交是指ai≠bj,i,j = 1, 2, ..., n。
例如:

是等于 (1 3 6)(2 5)(4)
因为:1 —> 3 —> 6 —> 1 (循环了),2 —> 5 —> 2(循环了),4 —> 4 (自己循环自己)。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = 1e5 + ;
int vis[maxn], a[maxn]; int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
memset(vis, , sizeof(vis));
for (int i = ; i <= n; i++)
{
if (vis[i])
continue;
printf("(%d", i); // 计算一个循环
vis[i] = ;
int j = a[i];
while (j != i)
{
printf(" %d", j);
vis[j] = ;
j = a[j];
}
printf(")");
}
printf("\n");
}
return ;
}
注意:上面的初始状态默认为 1 2 3 4...n 的
对于一般情况的初始状态(不一定是1 2 3 4...n),给出对应的目标状态,要求分解为不相交的循环乘积的个数。例如初始状态为 8 4 5 3 2 7,而目标状态为 2 3 4 5 7 8,则可以分解为两个循环的乘积,即(8 2 7)(4 3 5).代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = 1e5 + ;
int vis[maxn], a[maxn], b[maxn]; int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
int t;
for (int i = ; i <= n; i++)
{
scanf("%d", &t);
b[a[i]] = t;
}
/* for (int i = 1; i <= 8; i++)
if (b[i])
printf("b[%d] = %d\n", i, b[i]);
*/
memset(vis, , sizeof(vis));
for (int i = ; i <= n; i++)
{
int k = a[i];
if (vis[k])
continue;
printf("(%d", k); // 计算一个循环
vis[k] = ;
int j = b[k];
while (j != k)
{
printf(" %d", j);
vis[j] = ;
j = b[j];
}
printf(")");
}
printf("\n"); }
return ;
}

BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告的更多相关文章
- BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5108 题目意思:给出一个数正整数 N,N <= 1e9,现在需要找出一个最少的正整数 M,使得 ...
- BestCoder7 1002 Little Pony and Alohomora Part I(hdu 4986) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4986 题目意思:有 n 个box(从左到右编号依次为1~n),每个box里面有一个随机的钥匙,有可能这 ...
- BestCoder8 1001.Summary(hdu 4989) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4989 题目意思:给出 n 个数,然后将这些数两两相加,得到 n*(n-1) /2 对和,把重复的和去掉 ...
- BestCoder24 1001.Sum Sum Sum(hdu 5150) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5150 题目意思:就是直接求素数. 不过 n = 1,也属于答案范围!!只能说,一失足成千古恨啊---- ...
- BestCoder17 1001.Chessboard(hdu 5100) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5100 题目意思:有一个 n * n 的棋盘,需要用 k * 1 的瓷砖去覆盖,问最大覆盖面积是多少. ...
- BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5062 题目意思:给出 N,找出 1 - 10^N 中满足 Beautiful Palindrome N ...
- BestCoder12 1001.So easy(hdu 5058) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5058 (格式有点问题,为了方便阅读---整个复制下来吧) 题目意思:给出两个长度都为 n 的集合你,问 ...
- BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A ...
- BestCoder3 1001 Task schedule(hdu 4907) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4907 题目意思:给出工作表上的 n 个任务,第 i 个任务需要 ti 这么长的时间(持续时间是ti ~ ...
随机推荐
- rocketMQ--搭建demo的坑
果然不出所料,搭建起来就有坑 ,客户端经典的connection 11911的错误 在我的环境上解决方法加一行配置 brokerClusterName = DefaultClusterbrokerNa ...
- Android View 绘制流程(Draw) 完全解析
前言 前几篇文章,笔者分别讲述了DecorView,measure,layout流程等,接下来将详细分析三大工作流程的最后一个流程——绘制流程.测量流程决定了View的大小,布局流程决定了View的位 ...
- 无插件,跨平台,基于WebGL的三维地球来了!!!
用户通过浏览器即可递交数据到同一个地理信息系统中,操作简单,跨平台 ,无插件,可扩展,高效共享 ,完美匹配超大数据量发布! 近年来,随着计算机图形学.虚拟现实.卫星遥感.航空摄影.激光雷达等技术的迅猛 ...
- elasticsearch 最佳实践
创建索引 无mapping 创建索引名称为index的索引 curl -XPUT http://localhost:9200/book 有mapping 如果需要定义每个类型的结构映射,创建type名 ...
- [Algorithms] Quicksort algorithm using TypeScript
Quicksort (also called partition sort and pivot sort) is arguably the most used sorting algorithm. I ...
- STP 根桥、根port、指定port是怎样选举的
学习CCNA过程中,对交换机的根桥.跟port以及指定port选举有些迷糊.也度娘了一番,总认为一部分人解释的不够全面精细.通过细致研究终于有了自己的理解,分享给大家,假设纰漏,欢迎指正. STP收敛 ...
- ionic 修改应用名称 、启动页出现黑白屏 及 修改百度离线地图 点聚合 图标
1.ionic 修改应用名称 2.启动页打开后会在图片消失会出现一小段黑屏的时间 解决方法: 首先,启动页的图片消失时间默认是在config.xml配置的 <preference name=&q ...
- IOS_DatePicker_PickerView_SegmentControl_键盘处理
H:/0712/01_UIController_MJViewController.m // MJViewController.m // 01-总结复习 // Created by apple on 1 ...
- 使用JDBC连接SQL Server
源文:http://bbs.bc-cn.net/dispbbs.asp?boardid=12&id=140292 整理:秋忆 接触Java或者JSP,难免会使用到数据库SQL Server 2 ...
- 详谈kubernetes滚动更新-1
系列目录 这个系列分为两个小节,第一个小节介绍deployment滚动更新时,deployment.replicaset.pod的细节以及创建过程以及deployment版本管理的方式 第二个小节将介 ...