【学习笔记】珂朵莉树(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 ...
随机推荐
- ROS2时间同步(python)
最近1周一直研究ROS2的时间同步,翻越很多博客,很少有人使用ROS2进行时间同步的代码,无奈不断尝试与源码阅读,终于将其搞定, 为此,本博客将介绍基于python的ROS2的时间同步方法. 本博客内 ...
- 题解 AT2361 [AGC012A] AtCoder Group Contest
\(\sf{Solution}\) 显然要用到贪心的思想. 既然最终的结果只与每组强度第二大选手有关,那就考虑如何让他的值尽可能大. 其实,从小到大排个序就能解决,越靠后的值越大,使得每组强度第二大选 ...
- QML 怎么调用 C++ 中的内容?
以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「englyf」https://mp.weixin.qq.com/s/z_JlmNe6cYldNf11Oad_JQ 先说明一下测试环境 编 ...
- C#中winform DataGridView常用修改点
1.修改列名 一般情况下,从数据库里面读取的列名是英文或者拼音,但是,有时候显示需要中文,这样就需要修改列名了. dgv.Columns[0].HeaderCell.Value="编号&qu ...
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- java学习之MybBaits
0x00前言 我前面使用的jdbc和jdbc的工具类集成的但是它们在少部分代码的情况下会会简单,但是以后如果项目较大jdbc的固定代码会很难维护,如果使用框架会简单很多,也标志着java学习正式进入到 ...
- 洛谷P4135 Ynoi2016 掉进兔子洞 (带权bitset?/bitset优化莫队 模板) 题解
题面. 看到这道题,我第一反应就是莫队. 我甚至也猜出了把所有询问的三个区间压到一起处理然后分别计算对应询问答案. 但是,这么复杂的贡献用什么东西存?难道要开一个数组 query_appear_tim ...
- bugku 计算器
打开就一个输入框和验证,尝试后发现输入框限制了位数,这还不简单,F12直接修改表单长度试试 成功得到flag
- mingw编译opencv动态链接库和静态链接库及使用方法
前言 我一直不知道编译的过程以及cmake, make 这些工具是干什么的,所有抽时间研究了一下. 简单来说就是 cmake 是根据 CMakeLists.txt 用来生成 makefile文件的.而 ...
- 1.3 Apache Hadoop的重要组成-hadoop-最全最完整的保姆级的java大数据学习资料
目录 1.3 Apache Hadoop的重要组成 1.3 Apache Hadoop的重要组成 Hadoop=HDFS(分布式文件系统)+MapReduce(分布式计算框架)+Yarn(资源协调框架 ...