首先有暴力的做法就是每个点用一个
v
e
c
t
o
r
vector
vector 之类的存下所有可能的值以及概率
考虑如何合并,一个值的最终概率为它在子节点的概率乘上这一步取它的概率
而这一步取它的概率为另外一个子节点
<
<
< 它的概率和 * 取大的概率 +
>
>
> 它的概率和 * 取小的概率
我们考虑将合并改成线段树合并,每次处理左右子树概率的贡献,维护子树的概率和
边走边算贡献最后就是将一棵子树打上一个乘法标记
好题啊!
首先有贪心策略,在能选强化牌的时候尽量多选强化牌
于是我们可以枚举最后的
m
m
m 张有
i
i
i 张强化牌,那么
i
≥
k
i\ge k
i≥k,显然选择这
i
i
i 张中最大的
k
−
1
k-1
k−1 张,然后选一张最大的攻击牌
i
<
k
i<k
i<k,显然需要把
i
i
i 张用完,然后选
k
−
i
k-i
k−i 张最大的攻击牌
其实就是对于每一种选法统计当前选法的最优策略的和
考虑
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,k−1)∗G(m−i,1) 或者是
F
(
i
,
i
)
∗
G
(
m
−
i
,
k
−
i
)
F(i,i)*G(m-i,k-i)
F(i,i)∗G(m−i,k−i)
如何转移,我们考虑枚举前 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=j∑nf(j,k)∗(i−jn−k)
其中
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)=aj∗k=1∑j−1f(i−1,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=j∑ng(j,k)∗(i−jn−k)
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∗(j−1i−1)+k=1∑j−1g(i−1,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)
一开始只会三进制状压,比较显然,记录没有被考虑,被考虑有没有选进独立集即可
考虑压成二进制,看看哪一个状态没有用,一番尝试后考虑压成"有没有选进独立集"
假设当前考虑了
i
i
i 个点,当前这一步有
j
j
j 点可以放进独立集
那么会有
n
−
i
−
j
n-i-j
n−i−j 个点放不进去
不需要知道这些点具体是什么,乘上一个个数就可以转移了
一个点如果这一步放不进去那么只后就不可能放进去
这样一来就不会重复计数了
考虑大力容斥,钦定一个集合放在 1 号点的后方,也就是钦定 1 号点比这个集合都先死
∑
S
(
−
1
)
∣
S
∣
p
(
S
)
\sum_{S}(-1)^{|S|}p(S)
S∑(−1)∣S∣p(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)}
sum−sum(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=p∗sumsum(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∑∞(1−sumsum(S)+w1)i∗sumw1=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)∣S∣sum(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})
∏(1−xwi) 即可
分治
n
t
t
ntt
ntt
直接上
m
i
n
−
m
a
x
min-max
min−max 容斥,因为到一个集合的任意一个点的期望步数比较好求
树形
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(x∈S)
求子集和用
f
m
t
fmt
fmt 即可做到
O
(
n
∗
2
n
)
O(n*2^n)
O(n∗2n)