B17-20
T1:对原树建出大根笛卡尔树,先 dfs 一遍求出每个节点子树的 \(a_i\) 的和,记为 \(s_u\),再 dfs 一遍,设当前节点为 \(u\)(根显然不用考虑),父亲为 \(fa\),将 \(s_u\) 与 \(a_{fa}\) 比较,若 \(s_u \geq a_{fa}\),则 \(ans_u = ans_{fa}\),否则 \(ans_u = s_u\)。这是因为 \(u\) 的子树中的 \(a_i\) 一定都不大于 \(a_u\),那么 \(u\) 可以将子树中的节点尽数吃掉,然后其父亲就是其左边或右边的第一个不小于它的点,若无法吃掉那么显然就无法拓展了,答案为 \(s_u\),否则将父亲吃掉后一定可以将父亲的整个子树吃掉,那么此时和父亲完全等价,直接继承父亲的答案即可。复杂度 \(O(n)\)。
T2:考虑一个节点若原本无法吃掉某个节点,经过一系列过程后能吃掉了,那么其必然翻倍,那么翻倍次数的级别为 \(O(\log V)\)。建出线段树,设在线段树上的某个节点 \([L_i, R_i]\) 中,某个节点 \(p\) 能扩展到的区间为 \([l_p, r_p]\),并对区间维护出扩展到其的点的个数、对线段树节点维护扩展到节点左端点、右端点的区间,那么在合并两个线段树节点时,可以将左子节点的后缀、右子节点的前缀分别暴力扩展,复杂度带两个 \(\log\)。
T3:同样建出笛卡尔树,并维护出每个节点往左与往右的第一个不小于它的点,记为 \(l_i\) 和 \(r_i\)(其中有一个是笛卡尔树上的父亲)。此时的 \(ans_u\) 为自 \(u\) 开始时必须使用的道具数量,根的 \(ans\) 为 \(0\)。若 \(s_u \geq a_{fa}\),则 \(ans_u = ans_{fa}\),否则 \(ans_u\) 为 \(\min(ans_{l_i}, ans_{r_i}) + 1\)。因为吃掉子树后,若能直接吃掉父亲则与父亲等价,可直接继承,否则可以使用道具吃掉此时左边或右边的大节点并继承其状态。复杂度 \(O(n)\)。
T4:
T5:和 T3 一样,只需在比较 \(s_u\) 与 \(a_{fa}\) 时将 \(s_u\) 改为 \(s_u + k\) 即可。因为 \(k \geq 0\) 时一定不影响把比自己小的吃掉。
T6:考虑到将第 \(i\) 个节点减去 \(k\) 后(这里将原题的 \(k\) 看为负数,然后转为减去正数),其每次都相当于在少 \(k\) 的基础上合并,正好符合题意,那么问题转化为单点减常数、单点求值,可以转化为 T2,但会更劣一些,不会更优做法。
T7:不会。
T8:别急