【题解】P4292 [WC2010]重建计划

思路

点分治 + 单调队列

01 分数规划 + 长链剖分 + 线段树。

首先看到分数形式求最值先考虑分数规划,二分答案。

现在的问题是:是否存在长度在 [L,U] 之间的树上路径 S 使得 eSv(e)|S|ans

化简得 eSans|S|0

可以考虑给树上的每条边权值赋予一个当前二分出的变化量 Δ,这样直接判定是否存在权值和大于 0 的路径即可。

树上路径考虑点分治和长剖,这里点分治不好合并,长剖比较好写。

而且点分治常数应该挺大,虽然我的长剖跑不过

因为路径的合法长度是一个区间,所以最后查询答案需要区间查询,考虑用一棵线段树维护。

首先考虑继承答案。

类似重链剖分,考虑处理出每个结点的深子结点,然后按深子结点优先处理出每个结点的 dfs 序。显然一条深链的 dfs 序是连续的。

那么只需要把每个结点的答案存在对应的 dfs 序位置,就可以直接无痛继承了。

当然这里会增加一条边的权值,可以直接把它赋给当前结点的标记,最后从下到上累加标记就行。

考虑如何合并轻子结点的答案。根据长剖的复杂度分析,直接暴力线段树查询合并是可行的。

然后答案就直接分讨有拐点和无拐点的情况维护。

时间复杂度 O(nlog2n)

代码

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