前言
这篇文章的前置知识是Min_Max容斥,不会的同学可以先看一下我的另一篇博客
Min-Max容斥学习笔记
里面有详细的证明。
题目链接
做法
这道题实际上就是要就是要我们求全集合出现第$n-k+1$大元素的期望时间。
直接套用kth Min-Max容斥的结论。
$E(kthMax(S))=\sum_{S’\subseteq S}E(Min(S’))*(-1)^{|S’|-k}*\binom{|S’|-1}{k-1}$
$E(Min(S’))=\frac{m}{\sum_{i\in S’}P(i)}$
发现m的范围并不大,那么我们考虑dp
令$sum(S)$表示$\sum_{i\in S}P(i)$,$U$表示全集
$g_{i,j}$表示对于集合S,$|S|=i$,$sum(S)=j$的方案数。
转移只要考虑每次加进来一个数是否放到集合中就行了,答案的计算应该也是显然的,这里不多赘述了。
但是这样dp的复杂度是$O(n^2*m)$的,难以接受。
观察到还有$|n-k|\le 10$的限制条件,考虑改变dp状态
$f_{i,j}$表示对于集合S,$sum(S)=i$,出现第j大元素的期望时间的总和,显然$1 \le j \le |n-k|$
但是直接求期望时间不方便处理,考虑把期望时间拿掉。
用式子写出来
$f_{i,j}=\sum_{S’ \subseteq U}(-1)^{|S’|-j}*\binom{|S’|-1}{j-1}*[sum(S’)=i]$
考虑加入第t个物品:
如果不加入,则直接继承答案
如果加入的话,答案应该和$f_{i-p[t],j}$有关。
仍然用$g_{i,j}$表示对于集合S,$|S|=i$,$sum(S)=j$的方案数。
考虑展开$f_{i-p[t],j}$,把枚举集合变为枚举集合的大小。
那么$f_{i-p[t],j}=\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k-1}{j-1}*(-1)^{k-j}$
再考虑$\Delta f_{i,j}$,枚举转移过来的集合的大小k
$\Delta f_{i,j}=\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k}{j-1}*(-1)^{k-j+1}$
两个式子做加法
$\Delta f_{i,j}+f_{i-p[t],j}=\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k}{j-1}*(-1)^{k-j+1}+\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k-1}{j-1}*(-1)^{k-j}$
后面一项添个-1,将公因式提取一下得到
$\Delta f_{i,j}+f_{i-p[t],j}=\sum_{k=1}^{n}g_{k,i-p[t]}*[\binom{k}{j-1}-\binom{k-1}{j-1}]*(-1)^{k-j+1}$
也就是$\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k-1}{j-2}*(-1)^{k-j+1}$
而$(-1)^{k-j+1}=(-1)^{k-j-1}$
那么$\sum_{k=1}^{n}g_{k,i-p[t]}*\binom{k-1}{j-2}*(-1)^{k-j+1}=f_{i-p[t],j-1}$
所以我们dp就可以递推了,枚举第$t$个物品是否加入,滚动一下,用$f’$表示枚举到第$t-1$个物品时的状态。
$f_{i,j}=f’_{i,j}-f’_{i-p[t],j}+f’_{i-p[t],j-1}$
再考虑一下临界状态,直接代入可以知道$f_{p[t],1}=1$,所以只要$f_{0,0}=1$就行了,实际上$j=0$没有意义,所以其他时候不用转移。
最后算答案的时候也很简单。
枚举$i$,令$j=k$,$ans+=\frac{f[i][j]*m}{j}$就好了
复杂度$O(n*m*|n-k|)$
代码
1 |
|