题意
给定一颗
n
n
n给节点的完全二叉树,每个节点有
a
i
a_i
ai个苹果,有
m
m
m个果粉,每个果粉可以买从
u
i
u_i
ui到
v
i
v_i
vi的路径上的苹果(保证
u
i
u_i
ui是
v
i
v_i
vi的祖先),最多买
c
i
c_i
ci个,每买一个付出
s
i
s_i
si的钱,求最大收益。
数据范围:
n
,
m
≤
1
0
5
n,m\le 10^{5}
n,m≤105
题解
直观的想法是建图跑费用流,但效率不行,考虑用贪心结合本题性质模拟费用流(orzslz)。
容易想到按照 s i s_i si从大到小考虑每一个果粉,在不使前面果粉买的苹果数减少的前提下,尽量多买。于是关键在于对于当前的果粉可选的点,可以把一些被前面的人选走的苹果改成选在最高点,即所谓“退流”。而对于每一个选过的苹果,我们关心的只是它可选的最高点,这样就需要记录每个点分别最高可退流到每层的苹果数 f [ i ] [ j ] f[i][j] f[i][j]。
考虑对于一个果粉先从
v
i
v_i
vi往
u
i
u_i
ui选尽可能多的苹果,发现每选一个苹果就相当于把当前节点的
a
−
1
a-1
a−1(还可选的苹果数),
a
n
s
+
d
i
ans+d_i
ans+di,但这还要限制当前节点不能在
u
i
u_i
ui的上面。于是需要记录在选取过程中可选的最高到每一层的苹果数s[i](初始状态即为
s
[
d
[
u
[
i
]
]
]
=
c
[
i
]
s[d[u[i]]]=c[i]
s[d[u[i]]]=c[i]),以及当前
s
s
s不为
0
0
0的最低层
d
p
dp
dp。
对于一个点
u
u
u,先在可选的苹果中从下往上选,当它选完后,考虑能否利用
u
u
u使当前状态更优。考虑其可退的流,能使状态更优当且仅当其能退到小于
d
p
dp
dp的层(这里退流的意思即为把u上一些已选的能到达更高点的苹果换为可选的较低层的苹果),于是从最高层开始退,直到不能退为止。