题解 CF932D Tree
题意
一开始只有一个节点,编号为 1,权重为 0,$cnt$ 初始值为 1。
接下来给 $Q$ 个操作:
- $1$ $R$ $W$:加入一个节点(编号为 $cnt+1$,同时 $cnt$ 加一),该节点的权重为 $W$,父亲为 $R$。
- $2$ $R$ $X$:寻找最大长度的链满足:
- 从 $R$ 开始。
- 每个节点都是前一个节点的祖先。
- 这些节点的和值不超过 $X$。
- 对于任意两个相邻的节点 $i$,$j$($i$ 是 $j$ 的祖先,$w_i\ge w_j$),满足不存在节点 $k$ 位于 $i$ 到 $j$ 的简单路径上使得 $w_k\ge w_j$。
树的根恒定为 1。
输入是加密的,所输入的 $R$ 与 $W$、$X$ 都需要异或上上一次 2 操作的答案。(初始值为 0)。
希望能成为翻译。
解题
对于 2 操作的第 4 点,我们可以分析出,
- 我们并不需要想背包一样寻找更多的可转移的点,我们是找到就与前面的答案相连。
- 我们的 1 操作并不会影响其祖先的答案。
于是我们可以很快想到,我们可以用倍增来维护我们的答案。
在构图上,我们可以选择离线先把整棵树建完,也可以采用在插入节点时处理。
对于维护倍增,我们是寻找祖先中最近的大于等于当前值的节点,为了找到这个节点,我们需要不断寻找大于当前锁定节点的方式,快速找到这个节点。
Code。

浙公网安备 33010602011771号