P4118 [Ynoi2018] 末日时在做什么?有没有空?可以来拯救吗?

YNOI 智慧题

EasyVer1 [Ynoi Easy Round 2015] 世上最幸福的女孩
EasyVer2 小白逛公园

先看 EasyVer2

单点修改 区间查询最大子段和
考虑在线段树维护 前缀max后缀maxsum,和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)    收藏  举报

导航