题目名称 4178. 排列
输入输出 changgao_perm.in/out
难度等级 ★★☆
时间限制 1000 ms (1 s)
内存限制 512 MiB
测试数据 20
题目来源 Gravatar梦那边的美好ET 于2025-10-03加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:6, 提交:14, 通过率:42.86%
Gravatarxuyuqing 100 0.499 s 7.12 MiB C++
Gravatar梦那边的美好AC 100 0.598 s 5.41 MiB C++
Gravatar梦那边的美好ME 100 0.927 s 11.55 MiB C++
Gravatar梦那边的美好TT 100 0.950 s 7.64 MiB C++
Gravatar梦那边的美好TE 100 0.973 s 7.81 MiB C++
Gravatar梦那边的美好WA 100 1.617 s 5.33 MiB C++
Gravatar梦那边的美好WA 90 6.644 s 5.29 MiB C++
Gravatar梦那边的美好WA 90 6.869 s 5.26 MiB C++
Gravatar梦那边的美好AC 0 0.054 s 3.69 MiB C++
Gravatarxuyuqing 0 1.052 s 8.06 MiB C++
本题关联比赛
国庆欢乐赛2
关于 排列 的近10条评论(全部评论)
先来考虑一个排列可到达的条件是什么。
如果不是 n 排列,而是 01 序列的话,那么条件是显然的:只要对于任意 i,序列 b 的 第 i 个 1 都位于序列 a 的第 i 个 1 的右边(不一定严格),那么 a 就可以到达 b。
对于一个 n 排列 a,以及一个数 k,把 a 中大于 k 的数标为 1,剩下的数标为 0,
就能得 到一个 01 序列。如果对于任意的 k,排列 a 对应的 01 序列都能够到达排列 b 对
应的序列,那么排列 a 就可以到达排列 b。
它的必要性是显然的。至于充分性,可以观察下面这个移动策略: i 从 n 到 1 的顺
序,每次将数字 i 移到它的目标位置,令当前位置为 l,目标位置为 r,当前 (l, r] 区间的
最大数字为 a[j],那么把 a[l] 和 a[j] 交换一下即可。
容易看出这样移动一定是可行的。
那么只要做一个 01 串 DP: F[i][j]表示到第 i 位,已经用了的集合为 j 的方案数,从一个全 0 的串开始,每次转移
是枚举第 i 位放几,即将串中的某个 0 改为 1,最后到达一个全 1 的串,且保证经过的都
是合法 01 串。
Gravatar梦那边的美好ET
2025-10-04 15:11 1楼

4178. 排列

★★☆   输入文件:changgao_perm.in   输出文件:changgao_perm.out   简单对比
时间限制:1 s   内存限制:512 MiB

【题目描述】

【输入格式】

【输出格式】

【样例输入】

4 
2 4 1 3

【样例输出】

8

【样例说明】

【数据规模与约定】

【来源】

2019.2.21