首先可以发现一个显然的结论,就是对于每一种排序操作,只有最后一次该操作是对最终序列有影响的,于是一个长度为 的操作序列 ,我们把 中所有非最后一次出现的元素删去得到长度最多为 的操作序列序列 ,这两个操作序列是等价的。
我们考虑对合法的 计数,然后考虑乘上一个系数表示每一个 ,能拓展出多少种长度为 的 。设这个 的长度为 ,显然乘的系数就是第二类斯特林数 (考虑把 个位置划分为无序的 组,按照每一组最靠后的位置顺序来给该组元素安排操作),可以用容斥 预处理。
现在只需要计数 ,考虑对于合法的 有什么限制,显然最终只要满足每一个 都满足 都在 的前面即可。
对于每一个 ,都有一些位 满足 ,我们称这些位的集合为 ;还有一些位 满足 ,我们称这些位的集合为 。则限制变成以下两种:
-
对于每一个 , 出现在 序列内的最后位置一定后于 出现在 序列内的,否则 会被排到 之后。
-
对于所有原本 在 后面的 , 序列里必须出现至少一个 内的元素。
这两种限制都可以简单处理,对于第一种限制,预处理 为选了集合 的元素,接下来不能放在最前面的元素集合;对于第二种限制,预处理 为选了集合 的元素,是否满足强制要求。
最后直接 DP 即可:设 为包含元素为集合 的 序列方案数,转移则考虑枚举最前面新放了什么。
最终答案为:
时间复杂度为 ,可以轻松通过。