P4118 [Ynoi2018] 末日时在做什么?有没有空?可以来拯救吗?
YNOI 智慧题
EasyVer1 [Ynoi Easy Round 2015] 世上最幸福的女孩
EasyVer2 小白逛公园
先看 EasyVer2
单点修改 区间查询最大子段和
考虑在线段树维护 前缀max,后缀max,sum,和ansmax
合并的时候分讨即可
修改直接下放到底后回退 pushup 即可
接下来是 EasyVer1
全局修改 区间查询最大子段和
思考全局修改的实质
sum 是好维护的
对于 前缀max 和 后缀max 而言 全局修改是加上了一个一次函数
ansmax 是由 前缀max 和 后缀max 推出的
所以问题就是 前缀max 和 后缀max 怎么维护
其实这是一个经典问题 在斜率优化里面经常使用
就是维护一个上凸壳 根据斜率二分定点
但是 问题又出现了 我们有两个上凸壳 抽象一下问题
我们有2个上凸壳 不妨记为 \(f(x)\) 与 \(g(x)\) 我们需要求 \(f(x) + g(x)\) 的最大值
问题变成了 geometry
这个是 闵可夫斯基和 的应用之一
我们直接合并两个凸包然后在新凸包里面二分即可
于是 EasyVer2 就写完了
接下来是 boss 战
典型的想法是利用 EasyVer2 的全局加分块
然后整块就变成了 EasyVer2,散块重构线段树
分析复杂度
- 整块修改 \(O(1)\)
- 散块修改 \(O(B\ log\ B)\)
- 整块查询 \(O(B\ log\ B)\)
- 散块查询 \(O(B\ log^2\ B)\)
综上 \(O(n\sqrt n\log n)\)
1s 1e5 这对吗
考虑优化
- 零散修改
我们不一定要重建整棵线段树,而是考虑在子树上打tag,但是这个tag不能打在节点上 这样会干扰原来的标记 打在凸包上就不会有这个问题 - 整块查询
分块, 离线? 逐块处理!把查询按tag排序以后处理 用一个指针做就可以到 线性?
不对 你的排序确有log! 但是基数排序就不会有这个问题
这样我们就优化到了 \(O(m \sqrt n)\)。
接下来常数优化一下就好了。
鸣谢:
getdiff luogu608273
geomerty luogu765066
posted on 2025-02-27 12:11 FurinaHateComma 阅读(83) 评论(0) 收藏 举报
浙公网安备 33010602011771号