珂朵莉树

概念

/bx lxl

珂朵莉树是一种“基于数据随机的颜色段均摊”,通过 set 维护区间。其复杂度依赖于 assign 操作和数据随机。

使用 set 实现的珂朵莉树时间复杂度为 O(nloglogn),使用链表实现的珂朵莉树时间复杂度为 O(nlogn),详见 珂朵莉树的复杂度分析

思路

set 存储结构体代表区间。set 中所有元素对应的区间互不相交,取并得到的区间为 [1,n]

l1<l2,则 [l1,r1] 对应的结构体元素小于 [l2,r2] 对应的结构体元素

建树

珂朵莉树无固定建树方式,通常将需要的区间插入 set

CF896C 为例,只需 1in,将区间 [i,i] 插入 set 即可。

操作

珂朵莉树的主要操作:assignsplit

split(pos) 操作将珂朵莉树中包含下标 pos 的区间 [l,r] 分割成 [l,pos)[pos,r] 两部分,并返回 set[pos,r] 对应元素的迭代器。具体实现可以在 set 中二分第一个左端点大于等于 pos 的区间 [s,t],若 s=pos 则直接返回即可。反之在 set 中删去该区间与其前驱,表示删去包含 pos 的区间 [l,r]。最后在 set 中插入区间 [l,pos)[pos,r] 并返回迭代器。

assign 操作即为将区间 [l,r] 赋值成 x。利用 split 操作,先从包含 r+1 的区间中分裂出区间 [r+1,t1],并令其迭代器为 itr,再从包含 l 的区间中分裂出区间 [l,t2],令其迭代器为 itl。之后在 set 中从 itl 删除到 itr 的前驱,表示将珂朵莉树中与 [l,r] 存在交集的区间全部删除。最后插入新结构体表示区间 [l,r],赋值为 x 即可。

注意此处分裂区间为 先右后左,反之可能会导致返回的迭代器被错误删除。例:在 [1,n] 中删除 [2,n1]

珂朵莉树的复杂度依赖于 assign 操作。

珂朵莉树的其他操作大致思路是先 split(r + 1),再 split(l),得到表示 [l,r] 的所有区间,再暴力扫描这些区间进行维护。

例如区间加:

区间求第 k 小:

代码

CF896C 为例。

posted @   kymru  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
主题色彩