PKUWC 2018 简要题解

「PKUWC2018」Minimax

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

code


「PKUWC2018」Slay the Spire

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

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

如何转移,我们考虑枚举前 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 ) f(i,j) 表示选择 i i 张牌,最后一张钦定在 j j 的所有方案中 j j 张牌的积的和
考虑 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)
前缀和优化转移可以做到 O ( n 2 ) O(n^2)
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 ) g(i,j) 表示选择 i i 张牌,最后一张钦定在 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)
任然可以 O ( n 2 ) O(n^2)
然后需要求 m m 个本质不同的 F , G F,G ,每次 O ( n ) O(n)
复杂度 O ( n m + n 2 ) O(nm+n^2)

code


「PKUWC2018」随机算法

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

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

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

code


「PKUWC2018」猎人杀

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

S ( 1 ) S p ( S ) \sum_{S}(-1)^{|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)}
设现概率为 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 p 与原概率相同

于是集合 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}
所以
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}

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

code


「PKUWC2018」随机游走

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

code

发布了610 篇原创文章 · 获赞 94 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/103577508
今日推荐