作业2-1

B17-20

T1:对原树建出大根笛卡尔树,先 dfs 一遍求出每个节点子树的 ai 的和,记为 su,再 dfs 一遍,设当前节点为 u(根显然不用考虑),父亲为 fa,将 suafa 比较,若 suafa,则 ansu=ansfa,否则 ansu=su。这是因为 u 的子树中的 ai 一定都不大于 au,那么 u 可以将子树中的节点尽数吃掉,然后其父亲就是其左边或右边的第一个不小于它的点,若无法吃掉那么显然就无法拓展了,答案为 su,否则将父亲吃掉后一定可以将父亲的整个子树吃掉,那么此时和父亲完全等价,直接继承父亲的答案即可。复杂度 O(n)

T2:考虑一个节点若原本无法吃掉某个节点,经过一系列过程后能吃掉了,那么其必然翻倍,那么翻倍次数的级别为 O(logV)。建出线段树,设在线段树上的某个节点 [Li,Ri] 中,某个节点 p 能扩展到的区间为 [lp,rp],并对区间维护出扩展到其的点的个数、对线段树节点维护扩展到节点左端点、右端点的区间,那么在合并两个线段树节点时,可以将左子节点的后缀、右子节点的前缀分别暴力扩展,复杂度带两个 log

T3:同样建出笛卡尔树,并维护出每个节点往左与往右的第一个不小于它的点,记为 liri(其中有一个是笛卡尔树上的父亲)。此时的 ansu 为自 u 开始时必须使用的道具数量,根的 ans0。若 suafa,则 ansu=ansfa,否则 ansumin(ansli,ansri)+1。因为吃掉子树后,若能直接吃掉父亲则与父亲等价,可直接继承,否则可以使用道具吃掉此时左边或右边的大节点并继承其状态。复杂度 O(n)

T4:

T5:和 T3 一样,只需在比较 suafa 时将 su 改为 su+k 即可。因为 k0 时一定不影响把比自己小的吃掉。

T6:考虑到将第 i 个节点减去 k 后(这里将原题的 k 看为负数,然后转为减去正数),其每次都相当于在少 k 的基础上合并,正好符合题意,那么问题转化为单点减常数、单点求值,可以转化为 T2,但会更劣一些,不会更优做法。

T7:不会。

T8:别急

posted @   wf715  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示