$[JXOI2018]$ 排序问题
$Description$
$Solution$
先解释一下题意。
就是给你一个长度为 $n$ 的序列,然后允许插入 $m$ 个数到这个序列中,这 $m$ 个数的取值范围在 $[l,\ r]$ 之间,然后把这个序列排序,然后生成一个关于 $x_i$ 的编号排列,求使这个编号排列有序的操作次数的期望。
首先样例已经给出了解释,操作次数的期望就是成功概率的倒数。
然后考虑怎么去求出这个概率。
很显然对于一个不重的排列,成功的概率就是 $\dfrac{1}{n!}$ ,期望就是 $n!$ 。而对于一个有重复元素的排列,成功的概率则与单个重复元素的个数相关,显然如果某个元素出现了 $k$ 次,那么概率就会变成 $p \times \dfrac{k!}{n!}$ ,期望就会变成 $\dfrac{E(x)}{k!}$ 。
那么为了使期望最大,我们插入的数字显然要使得新的排列单个元素出现次数最大的最小。
看到最大的最小,就要想到二分。
先来考虑暴力贪心的做法,设置一个 $limit$ ,开一个桶记录最开始每个数的出现次数,然后先将当前出现次数最小的增加上去,最后将出现次数 $> 1$ 的逆元;累乘给 $Ans$ ,注意 $Ans$ 初始为 $(n + m) !$ 。
然后考虑二分答案。
二分新排列的元素的最大出现次数。
贪心的放,然后判断次数是否 $<= mid$ 。
二分出最大出现次数后解一个方程,解出有几个被放到 $L$ ,有几个是 $L - 1$ 。
注意最后要补上不在 $l \to r$ 范围内的重复数字的贡献以及 $l \to r$ 范围内的 $>= L$ 的数字的贡献。
其实也不算很难,只是中间蠢了没想到解方程怎么搞 。
就做完了。
$Code:$
1 |
|