【SDOI2017】苹果树
感觉出息了,从 2024 暑假开始接触这道题,今天才刚刚会。
题意
给出一棵树,每个节点上有
弱化版问题
弱化版:
直接从子树层面进行背包的复杂度大概是
我们将背包从子树层面搬到 dfn 层面,优化了复杂度。这是由于不需要支付子树合并的成本。考虑什么时候能做这样的变换,如果能通过一些手段使得子树内不需要承担过多的状态信息(该题利用下面的手段后子树不需要承担任何状态信息)即可。优化的复杂度只要来源于用技巧快速插入一个点来取代暴力的子树合并。如果没有这种技巧也很难做到复杂度的优化。
比如下面的问题:
每个点有价值
,限制 ,代表子树中选的点的数量不超过 ,求选择一些点的最大代价。
此时子树就需要承担选几个的信息,无法很好地优化复杂度。
回到这道题。令
-
不选,此时从
进行转移。 -
选,此时往
这个背包中插入 个价值为 个苹果后转移过来。
重点关注于后一种。对于
设插完以后得到的新背包是
原版问题
原版:
这个式子等价于可以选一条端点为根的链,链上面免费取一个苹果。
一个经典套路是,我们令一个点的所有子树按顺序排列(随便钦定一个顺序)。那么对于一个从根到某个点的链,会将整棵树劈成两部分,左边的部分按照 dfs 时结束访问的顺序是连续的一段前缀,右边的部分按照倒着 dfs 结束访问的顺序是一段连续的后缀。于是我们按照刚才的方法处理出前缀背包和后缀背包,及该条链上的背包,对三个背包进行合并可以做到
注意我们并不是将三个背包完全合并起来,而是只关注合并后第
继续优化,考虑能否去掉“该条链上的背包”,显然是可以的。我们令当前点到根的路径上的每个点都只选了至多
单调队列优化多重背包
考虑一般的转移:
如果能求出来所有的
在求
套路地,
记
关键思想就是将无关项分离。
时间复杂度为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?