最值分治
洛谷上申请全站推荐了,顺便在博客园上发一下。
确保自己大体了解笛卡尔树。本文包含以下内容:
-
性质
-
笛卡尔树合并
-
动态笛卡尔树(就是平衡树)
-
最值分治(主要内容)
一些性质
-
笛卡尔树的每个子树都是一段连续的区间。
-
的最值就是笛卡尔树上 维护的值。 -
随机数据下笛卡尔树期望深度
。
笛卡尔树合并
这里指的是随机数据下生成两个数组,同时我们分别有这两个序列的相同最值笛卡尔树,可以做到
由于笛卡尔树本身就是一个 treap 的结构,因此直接按照 treap 一样做就好。不多赘述。实际上用处也不大。
动态维护笛卡尔树
考虑需要修改序列上某个点的权值,维护其笛卡尔树,数据随机。我们直接删去那个点之后按照 BST 的删除合并左右子树,然后再尝试把修改后的数插入进去,实际上和 BST 是一致的。
练习:P2611。
最值分治
传统分治往往是找到区间中点,对两边分治,时间复杂度为
分治能进行在笛卡尔树上的原因主要在于其每个子树都是一个连续的区间,同时从
最值分治往往会给出一个和区间最值有关的式子要求计数或者最优化,我们枚举这个区间最值,那么区间左右端点就是要在左子树和右子树中各选一个点来满足这个式子,一般我们要是知道了某一个端点就能对另外一个端点计数,但是复杂度一般不允许任意枚举端点,因此对两个子树中大小较小的那个枚举(启发式分治),这样每个点最多会被枚举
一道板子题
问题本身和最大值有很大的联系,考虑最值分治。建出笛卡尔树,对于一个点
代码。
另一道板子题
这个
不能透露来源的题
给定一个长为
的序列,将这个序列划分成若干段,使得每一段的长度被夹在段内最小值和最大值之间,求方案数。 。
参考了一下这道题的题解区,表示感谢。
暴力 dp 不难想,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】