min-max容斥-最值反演及其推广

S是一个集合,max(S)min(S)分别表示集合中的最大值与最小值。

那么有如下式子成立:

max(S)=TS(1)|T|+1min(T)min(S)=TS(1)|T|+1max(T)

因为证明很简单就写一下吧,以第一个式子为例,设max(S)=x,那么只有T={x}时的min(T)x(可能有多个相同的最大值,这时候随便钦点一个就可以了),对于除此之外的所有T,肯定至少存在一个集合中的数y使得min(T{y})=min(T),假设有k个这样的y,那么从中选奇数个和选偶数个的方案数是一样的,于是min(T)就被抵消了。

这个式子在期望下也是成立的,即:

E[max(S)]=TS(1)|T|+1E[min(T)]

用期望的线性性证明即可。

于是就可以用来做题了,一般的套路是每个位置有概率从0变成1,问都变成1的期望步数,这就是max(S),然后就反演成min(T),至少一个数变成1的期望就好做很多了。

upd:来填坑了...现在来介绍一下最值反演的推广:通过求min来求第k大(kthmax)。前置知识是二项式反演,如果不知道请戳这里 (opens new window)

我们来尝试构造一个函数f,使得:

kthmax(S)=TSf|T|min(T)

然后来考虑一下对于集合中第i大的元素,如果min(T)等于这个元素,那么只有比它大的i1个元素是可能存在的,那么它的贡献就是:

j=0i1(i1j)fj+1

也就是说f需要满足:

j=0i1(i1j)fj+1=[i=k]

等价于:

j=0i(ij)fj+1=[i=k1]

为了方便我们用f^i=fi+1替换f,然后用gi表示[i=k1],那么就得到:

j=0i(ij)f^j=gi

看这个是不是一个经典的二项式反演的形式呀,所以二项式反演一下:

f^i=j=0i(1)ij(ij)gj

然后因为gi=[i=k1],所以上面的式子只有j=k1这一项是有贡献的,我们再把f替换回去,得:

fi+1=(1)ik+1(ik1)

再把fi+1替换成fi,最终得到:

fi=(1)ik(i1k1)

终于结束啦!

kthmax(S)=TS(1)|T|k(|T|1k1)min(T)

同时我们可以发现如果要求第k大,那么只需要计算元素个数k的子集就可以了。