ARC096D Sweet Alchemy

题意:给出一棵有根树,每个节点上有无穷多个物品,购买节点 的一个物品需要花费 元。

记节点 的物品购买了 个。则需要满足 ,其中 为给定常数。

问在有 元的情况下最多购得多少个物品。

,时限


数组做树上差分,记 ,则

而将 增加 所需的代价是子树 的和。而受益则为子树 的大小。

现在问题变成了 个物品的多重背包。(注意根不受 的限制)

很大,直接 不可行。

不难想到一种贪心,即按照性价比选择,可惜的是,这个贪心是错误的。

这个贪心能排除一些较劣的解,简化决策 : 若有两个物品 满足 ,且 ,显然可以将 换成 ,这样收益没有变化,但是代价减少了。

这告诉我们,购买某个物品个数超过 的部分可以贪心调整。所以每个物品保留 个做背包,区其余按照性价比贪心即可。

为获得收益为 时最小的成本,类似多重背包转移即可。使用二进制拆分实现,复杂度为