核心公式
maxi∈Sxi=∑T⊆S(−1)|T|−1minj∈Txjmini∈Sxi=∑T⊆S(−1)|T|−1maxj∈Txj
证明:转换成容斥原理的一般(集合)形式。构造映射 f:x↦{i|i≤x},则 f(min(x,y))=f(x)∩f(y),f(max(x,y))=f(x)∪f(y)。代入上式,得到:
maxi∈Sxi=|⋃i∈Sf(xi)|=∑T⊆S(−1)|T|−1|⋂j∈Tf(xj)|=∑T⊆S(−1)|T|−1minj∈Txj
对于第二个公式同理。
看似没有什么用,但是其在期望意义下也是成立的,即:
E(maxi∈Sxi)=∑T⊆S(−1)|T|−1E(minj∈Txj)E(mini∈Sxi)=∑T⊆S(−1)|T|−1E(maxj∈Txj)
扩展
kthmaxi∈Txi=∑S∈T(−1)|S|−k(|S|−1k−1)mini∈Txikthmini∈Txi=∑S∈T(−1)|S|−k(|S|−1k−1)maxi∈TxiE(kthmaxi∈Txi)=∑S∈T(−1)|S|−k(|S|−1k−1)E(mini∈Txi)E(kthmini∈Txi)=∑S∈T(−1)|S|−k(|S|−1k−1)E(maxi∈Txi)
证明好复杂。。不会。。
例题
看出了 Min-Max 容斥就是板子题了。可以设 xi 变量为第 i 位变成 1 的时间。求得就是:
E(maxi∈Sxi)
直接套板子:
E(maxi∈Sxi)=∑T⊆S(−1)|T|−1E(minj∈Txj)
转成了 min,这样就是“集合内第一个数变成 1” 的期望时间。可以设 x=∑T∩S≠∅aT,这样第一个数出现的期望就是:
E=x∞∑i=0(i−x)i(i+1)
用等比数列求和的套路变形两次就可以得到:
E=1x
多次求可以先求 1−x,即 ∑T∩S=∅aT,暴力是 O(3n),用 FWT 优化到 O(n2n)。
max 转成 min,设 gi 表示从 i 出发第一次到达 T 中的点的期望步数。可以归纳证明对于任意的 i,gi 都可以表示成 Ai+Bigfa。证明如下:
若 i∈T,则 gi=0。
若 i 是叶子,则 fi=1+fai。
否则 gi=1+1degi(gfa+∑j∈soniAj+Bjgi)。移项变形:
degigi=degi+gfa+∑j∈soniAj+Bjgi(degi−∑j∈soniBj)gi=degi+gfa+∑j∈soniAjgi=degi+∑j∈soniAjdegi−∑j∈soniBj+gfadegi−∑j∈soniBj
这样就不用 O(n3) 暴力高消了。所以对于枚举所有集合 T,每个集合 dfs 一遍求出 fT 表示从给定起点开始走到 T 中点的期望步数。预处理 fT(−1)|T|−1 的 FWT 数组,查询 O(1),总复杂度 O(n2nlogP+q)。稍微有点卡常,求逆元可以改成 exgcd。
比较神的题,但是难点不在第一步转化。
设 xi 表示第 i 种原料出现期望,就是求第 k 小的期望。但是这样只能转成最大,但是我们希望转成最小。所以看成是求第 n−k+1 大的期望。下记 k 表示题目中的 n−k+1,要求的就是:
∑T(−1)|T|−1(|T|−1k−1)E(mini∈Txi)
式中最后的期望就是 1∑i∈Tpi。但是这里 n 开到了 1000,肯定不能枚举子集。把上面的组合数拆开:
∑T(−1)|T|−1(|T|−1)k−1–––––(k−1)!1∑i∈Tpi
所以可以设 fi,j,k 表示考虑了前 i 个原料,T 的大小为 j,∑i∈Tpi 为 k,然后就发现爆了。
k 非常的小。这里有一步很厉害的转化。有组合恒等式:
(nm)=(n−1m−1)+(n−1m)
这样如果 |T| 增加了 1,可以从 k−1 和 k 转移。所以设 fi,j,k 表示考虑了 i 个原料,∑x∈Tpx=j 时 (−1)|T|−k(|T|−1k−1) 之和。推一下转移方程:
fi,j+pi,k=(−1)|T|−k+1(|T|k−1)=−(−1)|T|−k(|T|−1k−1)+(−1)|T|−k+1(|T|−1k−2)=−fi−1,j,k+fi−1,j,k−1fi,j,k=fi−1,j,k
边界是 f0,0,0=1,总复杂度 O(nm(n−k))。
总结
Min-Max 容斥的题感觉都比较套路,而且大部分都有非常明显的提示,比如 min 好求 max 不好求或者相反。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现