「PKUWC2018」Minimax
首先有暴力的做法就是每个点用一个
vector 之类的存下所有可能的值以及概率
考虑如何合并,一个值的最终概率为它在子节点的概率乘上这一步取它的概率
而这一步取它的概率为另外一个子节点
< 它的概率和 * 取大的概率 +
> 它的概率和 * 取小的概率
我们考虑将合并改成线段树合并,每次处理左右子树概率的贡献,维护子树的概率和
边走边算贡献最后就是将一棵子树打上一个乘法标记
code
「PKUWC2018」Slay the Spire
好题啊!
首先有贪心策略,在能选强化牌的时候尽量多选强化牌
于是我们可以枚举最后的
m 张有
i 张强化牌,那么
i≥k,显然选择这
i 张中最大的
k−1 张,然后选一张最大的攻击牌
i<k,显然需要把
i 张用完,然后选
k−i 张最大的攻击牌
其实就是对于每一种选法统计当前选法的最优策略的和
考虑
dp
我们令
F(i,j) 表示最后选出来
i 张强化牌的所有情况中,前
j 大的积的和
令
G(i,j) 表示最后选出来
i 张攻击牌的所有情况中,前
j 大的和的和
那么最后的答案显然是
F(i,k−1)∗G(m−i,1) 或者是
F(i,i)∗G(m−i,k−i)
如何转移,我们考虑枚举前
j 大的最后一个也就是第
j 大的位置
F(i,j)=k=j∑nf(j,k)∗(i−jn−k)
其中
f(i,j) 表示选择
i 张牌,最后一张钦定在
j 的所有方案中
j 张牌的积的和
考虑
f 的转移
枚举上一个的结尾
f(i,j)=aj∗k=1∑j−1f(i−1,k)
前缀和优化转移可以做到
O(n2)
同
f,我们有
G(i,j)=k=j∑ng(j,k)∗(i−jn−k)
g(i,j) 表示选择
i 张牌,最后一张钦定在
j 的所有方案中
j 张牌的和的和
那么显然新增贡献是当前贡献乘上方案数
f(i,j)=aj∗(j−1i−1)+k=1∑j−1g(i−1,k)
任然可以
O(n2)
然后需要求
m 个本质不同的
F,G,每次
O(n)
复杂度
O(nm+n2)
code
「PKUWC2018」随机算法
一开始只会三进制状压,比较显然,记录没有被考虑,被考虑有没有选进独立集即可
考虑压成二进制,看看哪一个状态没有用,一番尝试后考虑压成"有没有选进独立集"
假设当前考虑了
i 个点,当前这一步有
j 点可以放进独立集
那么会有
n−i−j 个点放不进去
不需要知道这些点具体是什么,乘上一个个数就可以转移了
一个点如果这一步放不进去那么只后就不可能放进去
这样一来就不会重复计数了
code
「PKUWC2018」猎人杀
考虑大力容斥,钦定一个集合放在 1 号点的后方,也就是钦定 1 号点比这个集合都先死
S∑(−1)∣S∣p(S)
其中
P(S) 表示一个集合都比 1 先死的概率
我们惊讶的发现一个结论,就是如果一个人死了,我们假装他没有死,给他打上一个标记,遇到有标记的就跳过,这样选到剩余人的概率与原概率相同,证明:
原概率
sum−sum(kill)wi
设现概率为
p,那么
p=p∗sumsum(kill)+sumwi
p 与原概率相同
于是集合
S 在 1 后面出现的概率就是
i=0∑∞(1−sumsum(S)+w1)i∗sumw1=sum(S)+w1w1
所以
Ans=S∑(−1)∣S∣sum(S)+w1w1
考虑
∑wi 比较小,可以枚举
sum(S)
那么就是要求
∑S(−1)∣S∣[sum(S)=x],构造生成函数
∏(1−xwi) 即可
分治
ntt
code
「PKUWC2018」随机游走
直接上
min−max 容斥,因为到一个集合的任意一个点的期望步数比较好求
树形
dp 时记录
f[x]=A[fa[x]]+B 即可,边界条件
f[x]=0(x∈S)
求子集和用
fmt 即可做到
O(n∗2n)
code