Luogu4769 [NOI2018] 冒泡排序
题意:对于排列,记数值
对于一个排列,若对其冒泡排序所需的交换次数达到上述下界,则称为好的。
求长度为
多组数据,
牛逼题。
Part1
考虑好排列的充要条件。
我们知道冒泡排序所需的交换次数达到下确界(每一步交换都是必须的),于是我们可以构造任意的交换方案。
每次交换我们都应当使
若
因此,若
进一步观察发现,这等价于要求不存在长度为
必要性:若存在三连降,考虑中间的数
,无论 还是 ,由于两侧都有不对的数,都不符合条件。充分性:若
,且我们要交换 ,此时 已经构成长度为 的下降子序列,于是 左侧不可能有 的数。类似地,
时也能保证正确性。显然交换不会中途产生三连降。
Part2
先不考虑字典序的限制。
用
设
下一步,若填更大的值,则必然合法。若填
于是有转移 :
尝试编一个组合意义:路径。
- 当位于
时,可以前往 或 。但不能使得 。
先不考虑「不能使得
「使得
于是,不合法方案与「从
综上我们能得到 :
Part3
接下来我们考虑字典序的限制。
枚举第一次不卡下界的位置,可以转化为:钦定一个前缀
首先判一下填写这个数是否已经未被了上述
记
注意到总有
于是只能填比
相当于将
转化为下列问题 :将
考虑
利用类似的技巧不难算得 :
复杂度