有些时候,我们想要计算一个集合 S 里元素的最小值/最大值,设最小值为 MIN(S)=x∈Sminx,最大值为 MAX(S)=x∈Smaxx。
但是有时我们想要求 MIN(S),但却很难求,反而 MAX(S) 很好求;或者想要求 MAX(S),但却很难求,反而 MIN(S) 很好求。那么这时就可以通过 Min-Max 容斥来实现 MIN(S) 和 MAX(S) 的互相转化,从而求得 MIN(S) 或者 MAX(S)。
朴素 Min-Max 容斥
Min-Max 容斥,先给出式子:
MIN(S)=T⊆S∑(−1)∣T∣+1MAX(T)MAX(S)=T⊆S∑(−1)∣T∣+1MIN(T)
先考虑第一个式子的证明:
首先假设 S 内元素互不相同(离散化),然后令 S 中元素升序排列后的数列为 A。
令 MAX(T)=Ai,有以下两种情况:
-
i=1,那么显然 ∣T∣=1,此时 MAX(T)=MIN(S),T 的贡献也就是 (−1)2MIN(S)=MIN(S);
-
i>1,那么集合内显然不可能存在满足 j>i 的 Aj,那么只有 2i−1 个集合贡献为 Ai,显然有 2i−2 个集合的大小是奇数,2i−2 个集合的大小是偶数,它们抵消了,所以此时 T 的贡献是 0;
第二个式子证明过程大体相同,只不过 A 换成了降序排列。
Min-Max 的优点在于它能实现 f(MIN(S)) 和 f(MAX(S)) 的不涉及到取 min 和取 max 操作的互相转化,其中 f 是任意一个线性函数,例如期望。
理解了它的原理后也不难推出式子:
f(MIN(S))=T⊆S∑(−1)∣T∣+1f(MAX(T))f(MAX(S))=T⊆S∑(−1)∣T∣+1f(MIN(T))
Kth-Min-Max 容斥
Min-Max 容斥的另一个优点在于,它还能求出集合 S 的第 k 大/小 MAXk(S) 和 MINk(S),推导如下:
考虑令 MINk(S)=T⊆S∑F(∣T∣)MAX(T),构造 F。
类似的,假设 S 内元素互不相同(离散化),然后令 S 中元素降升序排列后的数列 A。
我们设 MAX(T)=Ap 那么显然只有 T 不包含满足 j>p 的 Aj 才能让 MAX(T)=Ap,即有 p−1 个数可供选择,所以对于所有满足 MAX(T)=Ap 的 T,它的系数 F 是:
i=0∑p−1(ip−1)F(i+1)
求和函数的变量 i 表示除了 Ap 外多选的元素,然后 F(i+1) 表示选那么多数的贡献系数,(ip−1) 表示可以随便选择。
然后我们想让 F 满足:
i=0∑p−1(ip−1)F(i+1)=[p=k]
即:
i=0∑p(ip)F(i+1)=[p=k−1]
二项式反演一下:
[p=k+1]=i=0∑p(ip)F(i+1)⇒F(p+1)=i=0∑p(−1)p−i(ip)[i=k−1]
即:
F(p)=(−1)p−k(k−1p−1)
所以:
MINk(S)=T⊆S∑(−1)∣T∣−k(k−1∣T∣−1)MAX(T)MAXk(S)=T⊆S∑(−1)∣T∣−k(k−1∣T∣−1)MIN(T)
代入 k=1 验证:
MIN1(S)=T⊆S∑(−1)∣T∣−1(1−1∣T∣−1)MAX(T)=T⊆S∑(−1)∣T∣−1MAX(T)
发现得到了之前的式子,所以我们推对了。
同样的,Kth-Min-Max 容斥也可以套上任意线性函数。
应用
双倍经验:ABC242Ex Random Painting
要求所有球均被染色的时间,可以通过 Min-Max 容斥转化为求一个子集 S 中的球最早被染色的时间 TmeS。
进一步的,若 S 中的球被染色的概率为 p,那么 TmeS 就等于 p1。
而被染色的概率很好求,只要求出能给这些球染色的区间个数 sum,除以总的区间个数 (2n)+n 即可。
那么直接设 dpi,j 表示前 i 个球处理完毕,当前子集 S 选了球 i 且不被染色的选区间的方案数为 j 的选子集的方案数,转移的时候把容斥系数也乘进去,最后套 Min-Max 的式子即可。
时间复杂度 O(n4)。