作业2-1

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:别急

posted @ 2025-02-04 22:27  wf715  阅读(9)  评论(0编辑  收藏  举报