1 条题解
-
0
题目大意
有 名选手,编号为 到 ,他们被划分成若干个非空球队。球队的编号规则为:
将所有球队按照队中编号最小的选手排序;
球队编号从 开始连续分配。
例如,若选手分组为 、、,则:
号选手所在队为 号队;
号选手所在队为 号队;
号选手所在队为 号队。 对应的序列为 。
我们称一个长度为 的序列是合法的,当且仅当:
;
设前 位中出现的最大编号为 ,则 可以是 中的任意一个数,或者是 (表示新成立一个队伍)。
给定一个合法序列,要求计算它在所有合法序列按字典序排列中的排名(排名从 开始),并将结果对 取模。
算法思路
核心思想
利用动态规划预处理出从任意位置、任意当前最大编号出发,能生成的合法序列数目,再通过逐位确定法计算给定序列的字典序排名。
关键步骤
- 预处理前缀最大值
定义数组 ,其中 表示序列前 位中出现的最大编号。 递推计算:
用于在后续计算中限制第 位可选的数字范围。
- 倒序动态规划
定义 表示:从当前位开始,已知当前已出现的最大编号为 时,剩余位置能够生成的合法序列数目。
考虑当前位可以填的数字:
若填入一个已经出现过的编号 ,则有 种选择,后续方案数为 ;
若填入新编号 ,则后续方案数为 。
因此得到递推关系:
初始化时, 在序列末尾时取 (表示唯一一种空序列)。
在实际实现中,我们从序列末尾向前逐位更新 数组,使得 始终表示从当前位置往后的方案数。
- 计算字典序排名
从第 位到第 位依次处理:
对于第 位,枚举所有小于 的可能取值 ;
若 不超过 ,则当前最大编号仍为 ;
若 ,则最大编号更新为 ;
累加这些情况对应的方案数 到答案中。
最终,将累加结果 即为所求排名(因为序列本身也占一个位置)。
复杂度分析
时间复杂度:,主要来源于双重循环更新 数组。
空间复杂度:,用于存储 数组和前缀最大值数组。
总结
本题是经典的字典序排名问题,重点考察以下能力:
问题抽象与建模:将球队划分规则转化为序列合法性的形式化条件;
动态规划设计:定义合适的状态与递推关系,预处理方案数目;
字典序计数方法:利用逐位比较与累加的方式,高效计算目标序列的排名。
该解法在 的约束下可行,展示了组合数学与动态规划在计数类问题中的有效结合。
- 1
信息
- ID
- 4333
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者