- admin 的博客
Min-Max容斥小记
- @ 2026-7-10 10:01:27
广告 : 炫酷反演魔术
这个东西看起来挺冷门的,不过要是考的话到不会还真做不出来……
这东西也不是很复杂,本文应该不会太长吧……
我们现在有一个全集
我们设 (集合里的最小值)
相应的 (集合里的最大值)
假设我们能很轻松地求出任意集合的 ,但是我们不会(或者很难)求出任意集合的 。
Min-Max容斥就是通过一种奥妙重重的方式把,Min转换成Max(或者反之)。
结论:
$$\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\min(T)$$为什么是正确的呢?
我们设 以内的元素互不相同,如果相同的话我们就以编号为序,不影响后续推导。
我们设 为 内元素降序排序后排名第 的元素,也就是第 大。
设 那么 有那些情况呢?
1)
我们想得到的就是。
令 ,很明显只有一种可能那就是
所以贡献是
2)
最小的元素是 ,那么集合内不能存在比 小的 ,而只能存在 。
必然在内,剩下有种选法。
通过人类智慧得知,这种选法之中,有种是偶数,有种是奇数。
那么偶数的情况乘以,奇数的情况乘以,刚好消掉了。
贡献为
综上,除了的那一个,其余的贡献都消掉了。最后,贡献和是。
当然也可以把 转换成 ,公式是 $\min(S)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\max(T)$ ,十分对称。
附:Min-Max容斥定理在期望下也成立。
也就是说 $E(\max(S))=\sum\limits_{T\subseteq S}(-1)^{|T|+1}E(\min(T))$
这是非常有用的,因为期望下的 和 是很难求的。
假设有 两个不相关变量,则 。
例子:抛硬币, ,则
那么 $\max(a,b)=\begin{cases}\max(0,0)(25\%)\\ \max(0,1)(25\%)\\ \max(1,0)(25\%)\\ \max(1,1)(25\%)\end{cases}$ ,则
但是所以期望不能大力拆 或 。
- 例题 : P3175 [HAOI2015]按位或
第一眼看去很难把这道题和Min-Max容斥联想起来(目前而言)
由于或运算时每个位都是独立的,我们可以把每个位分开来看。
我们设为第个二进制位变为的时间。
那么我们要求的就是(为全集)。
如何求出呢?
离散期望计算公式,意思就是(值*对应概率)。
我们设为选中集合的概率,为选中的子集的概率。(为全集)
那么的概率就是:前k-1次选了的补集的子集,最后一次不能选的补集的子集。
得到
那么,$E(\min(S))=\sum\limits_{k=1}^∞k*P(k)=\sum\limits_{k=1}^∞k*P'(S⊕U)^{k-1}(1-P'(S⊕U))$
设
后面的式子就是等差*等比求和,错位相减:
求
整体乘得到:
两式相减得到: $(1-p)Sum=1*p^0+(2-1)p+(3-2)p^2+...=\dfrac{1-p^{∞}}{1-p}$
因为 ,所以 ,得到
所以
我们的目标是要求出 ,为了完成这个,我们要求出 。
我们知道 ,肉眼可见枚举子集。
肯定是会TLE的,所以请使用位运算卷积
卷积的 相当于子集求和,那么直接上就好了。
#include<algorithm>
#include<cstdio>
#define Maxn 1100000
using namespace std;
int n;
double a[Maxn];
int siz[Maxn];
int main()
{
scanf("%d",&n);n=(1<<n);
for (int i=0;i<n;i++)scanf("%lf",&a[i]);
for (int len=1;len<n;len<<=1)
for (int p=0;p<n;p+=len+len)
for (int i=p;i<p+len;i++)
a[i+len]+=a[i];
double ans=0;
for (int i=1;i<n;i++){
siz[i]=siz[i>>1]+(i&1);
double sav=(1-a[i^(n-1)]);
if (sav<1e-8){puts("INF");return 0;}
sav=1/sav;
ans+=(siz[i]&1) ? -sav:sav;
}printf("%.10lf",-ans);
return 0;
}
- 扩展形式
如果要求第大呢?那怎么办?
我们仍然考虑使用容斥(消去)的方法:
$Kth\!\max(S)=\sum\limits_{T\subseteq S}F(|T|)\min(T)$
是一个函数,根据直觉是可以构造出来的……
仿照上面的证明方法来构造:
设一个元素排名为第大,
那么有只有不包含比它小的个元素时,,有个元素可供随意选择,而且必然选择。
贡献系数是。
我们要令这个,也就是
接下来使用二项式反演,还不会的同学请见“炫酷反演魔术”。
二项式反演得到 $F(p+1)=\sum\limits_{i=1}^p(-1)^{p-i}\dbinom{p}{i}[i=k-1]=(-1)^{p-k+1}\dbinom{p}{k-1}$
所以 $F(p)=\sum\limits_{i=1}^p(-1)^{p-i}\dbinom{p}{i}[i=k-1]=(-1)^{p-k}\dbinom{p-1}{k-1}$
那么一开始的式子就变成了:
$Kth\!\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}\min(T)$
我们带入的情况,发现$1th\!\max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-1}\dbinom{|T|-1}{0}min(T)=\sum\limits_{T\subseteq S}(-1)^{|T|+1}\min(T)$
正和上面的经典形式相同。
喜闻乐见的是,扩展Min-Max容斥也是在期望意义下成立的,即:
$E(Kth\!\max(S))=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}E(\min(T))$
- 例题 : P4707 重返现世
题意:每秒按固定概率出现物品,求收集到 个物品的期望时间。
这道题还是很有难度的,这个黑牌不亏(或者是我的dp太菜了……)
分析:我们设集合 为某些物品的集合,物品的权值为第一次出现时间。
那么 就是这些物品中有其中一个出现的期望时间。
每一次得到 中物品的概率是 ,那么期望时间就是。
我们能求 了,我们再想想, ( 是全集)不就相当于期望耗时吗?
我们令下文的 ,求的就是 了,同时在题目中看到,这里的 。
套用上面的扩展Min-Max容斥,我们就得到了式子:
${\rm Ans}=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\dbinom{|T|-1}{k-1}E(\min(T))$
但是这里的 不能直接统计……
更新于 2026/7/5 06:20:07 作者
command_block
我们观察发现, ,一道数数题居然限制值域? 没准是复杂度和 有关的 。
这个 十分复杂,具体过程就不放在这里了,其余请见 题解 P4707 【重返现世】
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
总结:
Min-Max容斥,考察范围较窄,学过的基本一眼就能看出来(flag)
但是可以结合期望,集合求和dp优化或者容斥,二项式反演来考,所以难度还是挺大的。
况且近年来都喜欢出毒瘤数数题,这玩意以后可能会被出成没有这么模板的题目吧,期待ing~