PKUWC 2018 简要题解

「PKUWC2018」Minimax

首先有暴力的做法就是每个点用一个 v e c t o r vector vector 之类的存下所有可能的值以及概率
考虑如何合并,一个值的最终概率为它在子节点的概率乘上这一步取它的概率
而这一步取它的概率为另外一个子节点 < < < 它的概率和 * 取大的概率 + > > > 它的概率和 * 取小的概率
我们考虑将合并改成线段树合并,每次处理左右子树概率的贡献,维护子树的概率和
边走边算贡献最后就是将一棵子树打上一个乘法标记

code


「PKUWC2018」Slay the Spire

好题啊!
首先有贪心策略,在能选强化牌的时候尽量多选强化牌
于是我们可以枚举最后的 m m m 张有 i i i 张强化牌,那么
i ≥ k i\ge k ik,显然选择这 i i i 张中最大的 k − 1 k-1 k1 张,然后选一张最大的攻击牌
i < k ii<k,显然需要把 i i i 张用完,然后选 k − i k-i ki 张最大的攻击牌

其实就是对于每一种选法统计当前选法的最优策略的和
考虑 d p dp dp
我们令 F ( i , j ) F(i,j) F(i,j) 表示最后选出来 i i i 张强化牌的所有情况中,前 j j j 大的积的和
G ( i , j ) G(i,j) G(i,j) 表示最后选出来 i i i 张攻击牌的所有情况中,前 j j j 大的和的和
那么最后的答案显然是 F ( i , k − 1 ) ∗ G ( m − i , 1 ) F(i,k-1)*G(m-i,1) F(i,k1)G(mi,1) 或者是 F ( i , i ) ∗ G ( m − i , k − i ) F(i,i)*G(m-i,k-i) F(i,i)G(mi,ki)

如何转移,我们考虑枚举前 j j j 大的最后一个也就是第 j j j 大的位置

F ( i , j ) = ∑ k = j n f ( j , k ) ∗ ( n − k i − j ) F(i,j)=\sum_{k=j}^nf(j,k)*\binom{n-k}{i-j} F(i,j)=k=jnf(j,k)(ijnk)

其中 f ( i , j ) f(i,j) f(i,j) 表示选择 i i i 张牌,最后一张钦定在 j j j 的所有方案中 j j j 张牌的积的和
考虑 f f f 的转移
枚举上一个的结尾

f ( i , j ) = a j ∗ ∑ k = 1 j − 1 f ( i − 1 , k ) f(i,j)=a_j*\sum_{k=1}^{j-1}f(i-1,k) f(i,j)=ajk=1j1f(i1,k)
前缀和优化转移可以做到 O ( n 2 ) O(n^2) O(n2)
f f f,我们有 G ( i , j ) = ∑ k = j n g ( j , k ) ∗ ( n − k i − j ) G(i,j)=\sum_{k=j}^ng(j,k)*\binom{n-k}{i-j} G(i,j)=k=jng(j,k)(ijnk)

g ( i , j ) g(i,j) g(i,j) 表示选择 i i i 张牌,最后一张钦定在 j j j 的所有方案中 j j j 张牌的和的和
那么显然新增贡献是当前贡献乘上方案数
f ( i , j ) = a j ∗ ( i − 1 j − 1 ) + ∑ k = 1 j − 1 g ( i − 1 , k ) f(i,j)=a_j*\binom{i-1}{j-1}+\sum_{k=1}^{j-1}g(i-1,k) f(i,j)=aj(j1i1)+k=1j1g(i1,k)
任然可以 O ( n 2 ) O(n^2) O(n2)
然后需要求 m m m 个本质不同的 F , G F,G F,G,每次 O ( n ) O(n) O(n)
复杂度 O ( n m + n 2 ) O(nm+n^2) O(nm+n2)

code


「PKUWC2018」随机算法

一开始只会三进制状压,比较显然,记录没有被考虑,被考虑有没有选进独立集即可
考虑压成二进制,看看哪一个状态没有用,一番尝试后考虑压成"有没有选进独立集"

假设当前考虑了 i i i 个点,当前这一步有 j j j 点可以放进独立集
那么会有 n − i − j n-i-j nij 个点放不进去
不需要知道这些点具体是什么,乘上一个个数就可以转移了

一个点如果这一步放不进去那么只后就不可能放进去
这样一来就不会重复计数了

code


「PKUWC2018」猎人杀

考虑大力容斥,钦定一个集合放在 1 号点的后方,也就是钦定 1 号点比这个集合都先死

∑ S ( − 1 ) ∣ S ∣ p ( S ) \sum_{S}(-1)^{|S|}p(S) S(1)Sp(S)
其中 P ( S ) P(S) P(S) 表示一个集合都比 1 先死的概率
我们惊讶的发现一个结论,就是如果一个人死了,我们假装他没有死,给他打上一个标记,遇到有标记的就跳过,这样选到剩余人的概率与原概率相同,证明:

原概率 w i s u m − s u m ( k i l l ) \frac{w_i}{sum-sum(kill)} sumsum(kill)wi
设现概率为 p p p,那么
p = p ∗ s u m ( k i l l ) s u m + w i s u m p=p*\frac{sum(kill)}{sum}+\frac{w_i}{sum} p=psumsum(kill)+sumwi
p p p 与原概率相同

于是集合 S S S 在 1 后面出现的概率就是
∑ i = 0 ∞ ( 1 − s u m ( S ) + w 1 s u m ) i ∗ w 1 s u m = w 1 s u m ( S ) + w 1 \sum_{i=0}^{\infty}(1-\frac{sum(S)+w_1}{sum})^i*\frac{w_1}{sum}=\frac{w_1}{sum(S)+w_1} i=0(1sumsum(S)+w1)isumw1=sum(S)+w1w1
所以
A n s = ∑ S ( − 1 ) ∣ S ∣ w 1 s u m ( S ) + w 1 Ans=\sum_{S}(-1)^{|S|}\frac{w_1}{sum(S)+w_1} Ans=S(1)Ssum(S)+w1w1

考虑 ∑ w i \sum w_i wi 比较小,可以枚举 s u m ( S ) sum(S) sum(S)
那么就是要求 ∑ S ( − 1 ) ∣ S ∣ [ s u m ( S ) = x ] \sum_S (-1)^{|S|}[sum(S)=x] S(1)S[sum(S)=x],构造生成函数 ∏ ( 1 − x w i ) \prod (1-x^{w_i}) (1xwi) 即可
分治 n t t ntt ntt

code


「PKUWC2018」随机游走

直接上 m i n − m a x min-max minmax 容斥,因为到一个集合的任意一个点的期望步数比较好求
树形 d p dp dp 时记录 f [ x ] = A [ f a [ x ] ] + B f[x]=A[fa[x]]+B f[x]=A[fa[x]]+B 即可,边界条件 f [ x ] = 0 ( x ∈ S ) f[x]=0(x\in S) f[x]=0(xS)
求子集和用 f m t fmt fmt 即可做到 O ( n ∗ 2 n ) O(n*2^n) O(n2n)

code

你可能感兴趣的:(省选,NOI题解)