【学习笔记】珂朵莉树(ODT)
珂朵莉树
\(\tt 0x00\) 起源
起源于 CodeForces 的一题 CF896C,当时出题人提供了这种做法,在随机数据下均摊复杂度比较优秀。
正统名字好像叫颜色段均摊,由于题目也得名于 \(\overset{\tt{Old}}{\texttt{珂}}\overset{\tt{Driver}}{\texttt{朵}}\overset{\tt{Tree}}{\texttt{莉}}\texttt{树}\)。
\(\tt 0x01\) 基本结构
先看代码:
struct node{
ll l,r;
mutable ll v;
node(ll _l,ll _r=0,ll _v=0): l(_l),r(_r),v(_v){}
bool operator<(const node &rhs)const{
return l<rhs.l;
}
};
set<node> s;
结构体中的 \(l,r\) 指数列中 \([l,r]\) 段的左右端点,\(v\) 指这一段表示的数字。
\(\tt{mutable}\) 可让只读迭代器修改其中 \(v\) 的值。
重载运算符 <
的用意是让所有区间按照左端点从小到大排序。
例如原数列为
经过颜色均摊之后,形成的珂朵莉树是这样的:
\(\tt 0x02\) split
珂朵莉数核心操作:split
,作用是以 \(pos\) 为分界线,把 \([l,r]\) 分为 \([l,pos-1]\) 和 \([pos,r]\) 两段,函数的返回值是指向 \([pos,r]\) 的迭代器。
为省时间且好写,set<node>::iterator
可以 typedef
一下或直接用 auto
(C++14 及以后)。
代码:
auto split(int pos){
auto it=s.lower_bound(node(pos)); //按 l 找包含 pos 的 node
if(it!=s.end() && it->l==pos) return it; //找到且为区间左端点,直接返回
it--;//要么没找到,要么是包含 pos 的 node 的后一个 node
if(it->r<pos) return s.end(); //没找到,返回
ll l=it->l,r=it->r,v=it->v; //复制一份
s.erase(it); //删掉这个区间
s.insert(node(l,pos-1,v)); //插入左区间
return s.insert(node(pos,r,v)).first; //插入右区间,并返回右区间的迭代器
}
\(\tt 0x03\) assign
对应区间推平操作。因为我们的 \([l,r]\) 可能包含在其他区间内,所以我们要先把 \(l,r\) split
出来,然后删除中间的所有节点,最后插入一个 \((l,r,v)\) 即可。
注意分裂时要先 split(r+1)
再 split(l)
,不然可能会导致原来指向 split(l)
的迭代器释放,造成 RE。
代码:
void assign(ll l,ll r,ll x){
auto itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,x));
}
\(\tt 0x04\) 其他操作
基本都是套板子:
void modify(ll l,ll r,ll x){
auto itr=split(r+1),itl=split(l);
for(auto it=itl;it!=itr;it++)
// do sth
}
\(\tt 0x05\) 例题
- https://www.luogu.com.cn/problem/CF896C (梦开始的地方)
- https://www.luogu.com.cn/problem/SP13015 (前置知识:素数筛)
- https://www.luogu.com.cn/problem/SP19568 (上一题加强版,加了单点修改操作)
- https://www.luogu.com.cn/problem/CF915E (珂朵莉树板子)
\(\tt 0x06\) 完整代码
【学习笔记】珂朵莉树(ODT)的更多相关文章
- 「学习笔记」珂朵莉树 ODT
珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...
- 珂朵莉树(ODT)笔记
珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原 ...
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- Chtholly Tree (珂朵莉树) ODT
ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...
- 珂朵莉树(Chtholly Tree)学习笔记
珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...
- [数据结构]ODT(珂朵莉树)实现及其应用,带图
[数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...
- 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树
正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...
- 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)
洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...
- 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)
传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...
随机推荐
- AgileBoot - 如何集成内置数据库H2和内置Redis
本项目地址: github: https://github.com/valarchie/AgileBoot-Back-End gitee: https://gitee.com/valarchie/Ag ...
- AIR32F103(三) Linux环境基于标准外设库的项目模板
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- 《HelloGitHub》第 79 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...
- Java基础面试总结
常见编译型语言:C.C++.Go.Rust 等(执行速度快,但开发效率低) 常见解释型语言:Python.JavaScript.PHP(开发效率高,但执行效率低) 先编译后解释:Java 重载和重写有 ...
- Springboot结构梳理
springboot各层关系梳理 1.基本流程 View层-->Controller层(响应用户请求):导入 service层,调用你service方法,controller通过接受前端传来的参 ...
- 不一样的纯H5C3动画爱心
最近抖音很火的让你会计算机的朋友给你做个爱心突然火了,我也不出意外的收到了朋友的邀请,自己做肯定太麻烦了于是乎百度第一步,惊呆了!网上全都是一个爱心,变着法的火焰爱心,换汤不换药,那我们肯定是要整点不 ...
- RabbitMq消息手动应答、放回队列重新消费、设置队列消息持久化、分发模式
RabbitMq消息手动应答,放回队列重新消费,设置队列消息持久化 消息应答 概念 消费者完成一个任务可能需要一段时间,如果其中一个消费者处理一个长的任务并仅只完成了部分突然它挂掉了,会发生什么情况. ...
- gRPC(Java) keepAlive机制研究
基于java gRPC 1.24.2 分析 结论 gRPC keepAlive是grpc框架在应用层面连接保活的一种措施.即当grpc连接上没有业务数据时,是否发送pingpong,以保持连接活跃性, ...
- jquery组件解决option选项框的样式自定义方案
记录一下今天工作中遇到的一个需求和自行找到的解决办法 需求: 在原始的select选项框中的增加一个标识.(我想增加一个具有样式的span元素,试了半天在option里无法添加span,更别说具有样式 ...
- qtcreator 报错error: You need to set an executable in the custom run configuration.
解决 没有配置运行的可执行文件. 在 Executable 中填入正确的可执行文件位置,这里我使用了一个变量,可以根据 release,debug的区别自动找到对应的可执行文件.