【题解】P2305 [NOI2014] 购票

题意

给定一棵边带权且以 1 为根的树,从后代结点 u 跳到祖先结点 v 的代价为 dpu+qu,其中 pu,qu 是给定的常数,du,v 的树上距离。要求只有 dlu 时才能从 u 跳到 v1<in,求从点 i 跳到点 1 的最小代价。

n2×105

思路

点分治 + 斜率优化 dp.

观察转移的代价代价,可以写成 (depth(u)depth(v))pu+qu+fv 的形式,拆开得到:

depth(u)pudepth(v)pu+qu

满足斜率优化的形式,考虑从点 i 转移优于从点 j 转移的条件:

depth(u)pudepth(i)pu+qu+fidepth(u)pudepth(j)pu+qu+fj

fidepth(i)pufjdepth(j)pu

移项得到 fifjdepth(i)pudepth(j)pu

fifjdepth(i)depth(j)pu

但是这里的斜率优化是在树上做的,随 dfs 回溯复杂度摊下来是假的。

于是可以考虑用点分治优化。

点分治考虑的是每次划分出子树重心,那么转移的贡献可以分成两部分:

  1. 当前子树除重心所在子树之外的部分 -> 其自身

  2. 当前子树除重心所在子树之外的部分 -> 重心所在子树

那么可以考虑在点分治的时候维护第二类贡献。

但是问题在于每个点可以转移到范围不固定也不单调,比较难搞。

这里可以考虑在点分每层的时候把所有结点按照可以转移的范围从小到大排序,于是就不需要考虑撤销操作。

那么现在只需要考虑维护加入点的贡献即可,这里直接上果的丹钓战。

注意 x 坐标不单调,要在凸包上二分最优的转移位置。

代码

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