min-max容斥

min-max 容斥

简单来说,我们想要通过集合最小值计算出最大值:
max ⁡ ( S ) = ∑ T ⊆ S min ⁡ ( T ) ⋅ ( − 1 ) ∣ T ∣ − 1 \max(S)=\sum_{T\subseteq S}\min(T)\cdot (-1)^{|T|-1} max(S)=TSmin(T)(1)T1
证明是构造一个映射f(T),设 x 为最大值, f ( T ) → f ( T ⊕ x ) f(T)\rightarrow f(T\oplus x) f(T)f(Tx),显然这是一个一一映射,且一个映射的最小值相同,恰好抵消。只剩下 {x} 的贡献。

同理,也可以用 max 容斥出 min: min ⁡ ( S ) = ∑ T ⊆ S max ⁡ ( T ) ⋅ ( − 1 ) ∣ T ∣ − 1 \min(S)=\sum_{T\subseteq S}\max(T)\cdot(-1)^{|T|-1} min(S)=TSmax(T)(1)T1

这样的一个好处是,对于期望,也可以进行 minmax 容斥。此时 max 表示满足所有条件的期望,min 表示满足至少一个条件的期望。

1

PKUWC2018 随机游走
利用 min-max 容斥,问题转化成求经过集合中至少一个点的期望。
f [ u ] = 1 + 1 d u [ u ] f [ f a ] + 1 d u [ u ] ∑ v ∈ s o n u f [ v ] f[u]=1+\frac 1{du[u]}f[fa]+\frac 1{du[u]}\sum_{v\in son_u}f[v] f[u]=1+du[u]1f[fa]+du[u]1vsonuf[v]

需要用到树上高斯消元的技巧。发现 f [ u ] f[u] f[u] 可以用 k u f [ f a ] + b u k_uf[fa]+b_u kuf[fa]+bu 表示。

∑ v ∈ s o n u f [ v ] = ∑ k v f [ v ] + b v \sum_{v\in son_u}f[v]=\sum k_vf[v]+b_v vsonuf[v]=kvf[v]+bv代回上式得:

f [ u ] = 1 + 1 d u [ u ] f [ f a ] + 1 d u [ u ] f [ u ] ∑ k v + 1 d u [ u ] ∑ b v f[u]=1+\frac 1{du[u]}f[fa]+\frac 1{du[u]}f[u]\sum k_v+\frac 1{du[u]}\sum b_v f[u]=1+du[u]1f[fa]+du[u]1f[u]kv+du[u]1bv
( 1 − ∑ k v d u [ u ] ) f [ u ] = 1 + 1 d u [ u ] f [ f a ] + 1 d u [ u ] ∑ b v \bigg(1-\frac{\sum k_v}{du[u]}\bigg)f[u]=1+\frac 1{du[u]}f[fa]+\frac 1{du[u]}\sum b_v (1du[u]kv)f[u]=1+du[u]1f[fa]+du[u]1bv

除过去就能解出 k u , b u k_u,b_u ku,bu

这样可以在 O ( n 2 n ) O(n2^n) O(n2n) 的时间求出每个 M i n ( S ) Min(S) Min(S)。要求 M a x ( S ) Max(S) Max(S),FWT即可。

扩展 min-max 容斥

利用类似的想法,我们想要用 min 来计算出第 k 大。也就是说,我们希望找到容斥系数 f ( ∣ T ∣ ) f(|T|) f(T) 满足如下式子:
kthmax ( S ) = ∑ T ⊆ S f ( ∣ T ∣ ) ⋅ min ⁡ ( T ) \text{kthmax}(S)=\sum_{T\subseteq S}f(|T|)\cdot \min(T) kthmax(S)=TSf(T)min(T)

那么对于第 t 大的元素,我们想让它的系数为 [t==k],也就是:
∑ i = 1 t ( t − 1 i − 1 ) f ( i ) = [ t = = k ] \sum_{i=1}^{t}{t-1\choose i-1}f(i)=[t==k] i=1t(i1t1)f(i)=[t==k]

反演一下:
f ( n ) = ∑ i = 1 n ( − 1 ) n − i ( n − 1 i − 1 ) [ i = = k ] f(n)=\sum_{i=1}^n(-1)^{n-i}{n-1\choose i-1}[i==k] f(n)=i=1n(1)ni(i1n1)[i==k]

得到:
f ( n ) = ( − 1 ) n − k ( n − 1 k − 1 ) f(n)=(-1)^{n-k}{n-1\choose k-1} f(n)=(1)nk(k1n1)

因此我们要求的可以写成:
kthmax ( S ) = ∑ T ⊆ S ( − 1 ) ∣ T ∣ − k ( ∣ T ∣ − 1 k − 1 ) min ⁡ ( T ) \text{kthmax}(S)=\sum_{T\subseteq S}(-1)^{|T|-k}{|T|-1\choose k-1} \min(T) kthmax(S)=TS(1)Tk(k1T1)min(T)

2

luoguP4707 重返现世
n 种物品,每种物品每一时刻出现的概率是 p_i,求收集到 k 种物品的期望时间。
1 ≤ n ≤ 1000 , 1 ≤ k ≤ n , ∣ n − k ∣ ≤ 10 1\leq n\leq 1000,1 \le k \le n,\lvert n - k \rvert \le 10 1n1000,1kn,nk10

显然我们要求的是 (n-k+1)thmax(S) \text{(n-k+1)thmax(S)} (n-k+1)thmax(S)。根据上面的式子,我们只需要 DP 出系数即可。设 f ( i , j , k ) f(i,j,k) f(i,j,k) 表示考虑了前 i 个物品, ∑ p i = j \sum p_i=j pi=j,那个组合数乘上 -1 的多少次方之和。转移是 f ( i , j , k ) = f ( i − 1 , j , k ) − f ( i − 1 , j − p [ i ] , k ) + f ( i − 1 , j − p [ i ] , k − 1 ) f(i,j,k)=f(i-1,j,k)-f(i-1,j-p[i],k)+f(i-1,j-p[i],k-1) f(i,j,k)=f(i1,j,k)f(i1,jp[i],k)+f(i1,jp[i],k1)

你可能感兴趣的:(精髓总结/算法解析,反演,min-max容斥)