简单来说,我们想要通过集合最小值计算出最大值:
max ( S ) = ∑ T ⊆ S min ( T ) ⋅ ( − 1 ) ∣ T ∣ − 1 \max(S)=\sum_{T\subseteq S}\min(T)\cdot (-1)^{|T|-1} max(S)=T⊆S∑min(T)⋅(−1)∣T∣−1
证明是构造一个映射f(T),设 x 为最大值, f ( T ) → f ( T ⊕ x ) f(T)\rightarrow f(T\oplus x) f(T)→f(T⊕x),显然这是一个一一映射,且一个映射的最小值相同,恰好抵消。只剩下 {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)=T⊆S∑max(T)⋅(−1)∣T∣−1
这样的一个好处是,对于期望,也可以进行 minmax 容斥。此时 max 表示满足所有条件的期望,min 表示满足至少一个条件的期望。
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]1v∈sonu∑f[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 v∈sonu∑f[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]1∑bv
( 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 (1−du[u]∑kv)f[u]=1+du[u]1f[fa]+du[u]1∑bv
除过去就能解出 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 来计算出第 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)=T⊆S∑f(∣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=1∑t(i−1t−1)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=1∑n(−1)n−i(i−1n−1)[i==k]
得到:
f ( n ) = ( − 1 ) n − k ( n − 1 k − 1 ) f(n)=(-1)^{n-k}{n-1\choose k-1} f(n)=(−1)n−k(k−1n−1)
因此我们要求的可以写成:
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)=T⊆S∑(−1)∣T∣−k(k−1∣T∣−1)min(T)
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 1≤n≤1000,1≤k≤n,∣n−k∣≤10
显然我们要求的是 (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(i−1,j,k)−f(i−1,j−p[i],k)+f(i−1,j−p[i],k−1)。