珂朵莉树

\(\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\) 例题

\(\tt 0x06\) 完整代码

\(\text{Link}\)

【学习笔记】珂朵莉树(ODT)的更多相关文章

  1. 「学习笔记」珂朵莉树 ODT

    珂朵莉树,也叫ODT(Old Driver Tree 老司机树) 从前有一天,珂朵莉出现了... 然后有一天,珂朵莉树出现了... 看看图片的地址 Codeforces可还行) 没错,珂朵莉树来自Co ...

  2. 珂朵莉树(ODT)笔记

    珂朵莉树,又叫老司机树($Old\, Driver \, Tree$) 是一种暴力出奇迹,就怕数据不随机的数据结构. 适用 需要用线段树维护一些区间修改的信息…… 像是区间赋值(主要),区间加…… 原 ...

  3. [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解

    参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...

  4. Chtholly Tree (珂朵莉树) ODT

    ODT,OldDriverTree,又名ChthollyTree" role="presentation" style="position: relative; ...

  5. 珂朵莉树(Chtholly Tree)学习笔记

    珂朵莉树(Chtholly Tree)学习笔记 珂朵莉树原理 其原理在于运用一颗树(set,treap,splay......)其中要求所有元素有序,并且支持基本的操作(删除,添加,查找......) ...

  6. [数据结构]ODT(珂朵莉树)实现及其应用,带图

    [数据结构]ODT(珂朵莉树)实现及其应用,带图 本文只发布于博客园,其他地方若出现本文均是盗版 算法引入 需要一种这样的数据结构,需要支持区间的修改,区间不同值的分别操作. 一般的,我们会想到用线段 ...

  7. 洛谷$P2572\ [SCOI2010]$ 序列操作 线段树/珂朵莉树

    正解:线段树/珂朵莉树 解题报告: 传送门$w$ 本来是想写线段树的,,,然后神仙$tt$跟我港可以用珂朵莉所以决定顺便学下珂朵莉趴$QwQ$ 还是先写线段树做法$QwQ$? 操作一二三四都很$eas ...

  8. 洛谷AT2342 Train Service Planning(思维,动态规划,珂朵莉树)

    洛谷题目传送门 神仙思维题还是要写点东西才好. 建立数学模型 这种很抽象的东西没有式子描述一下显然是下不了手的. 因为任何位置都以\(k\)为周期,所以我们只用关心一个周期,也就是以下数都在膜\(k\ ...

  9. 洛谷P4344 [SHOI2015]脑洞治疗仪(珂朵莉树)

    传送门 看到区间推倒……推平就想到珂朵莉树 挖脑洞直接assign,填坑先数一遍再assign再暴力填,数数的话暴力数 //minamoto #include<iostream> #inc ...

随机推荐

  1. Java多线程-ThreadPool线程池(三)

    开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...

  2. 成熟企业级开源监控解决方案Zabbix6.2关键功能实战-上

    @ 目录 概述 定义 监控作用 使用理解 监控对象和指标 架构组成 常用监控软件分析 版本选型 俗语 安装 部署方式 部署 zabbix-agent 概述 定义 Zabbix 官网地址 https:/ ...

  3. VBA---文件操作

    Text文件操作 Workbooks.OpenText() 载入一个文本文档,并将其作为包含单个工作表的新工作簿进行分列处理. 语法: 表达式.OpenText(Filename,StartRow, ...

  4. Mysql InnoDB多版本并发控制MVCC

    参考书籍<mysql是怎样运行的> 系列文章目录和关于我 一丶为什么需要事务隔离级别 mysql是一个客户端/服务断软件,对于同一个服务器来说,可以有多个客户端进行连接,每一个客户端进行连 ...

  5. 【题解】CF1013B And

    题面传送门 解决思路 首先我们可以得出,$ a $ \(\&\) $ x $ \(=\) $ a $ \(\&\) $ x $ \(\&\) $ x $.由此得知,同一个 \( ...

  6. 基于python的数学建模---机场航线设计

    数据集 拿走: 链接:https://pan.baidu.com/s/1zH5xhpEmx2_u5qO9W4gCkw 提取码:2wl5 数据集来自航空业,有一些关于航线的基本信息.有某段旅程的起始点和 ...

  7. redis集群之主从复制集群的原理和部署

    最近在复盘redis的知识,所以本文开始希望介绍下redis的集群架构.原理以及部署:本文主要介绍redis的主从复制集群,包括其架构模型,原理,高可用等: 一.主从集群的介绍   redis的主从复 ...

  8. 《MySQL必知必会》知识汇总二

    六.用通配符进行过滤 本章介绍什么是通配符.如何使用通配符以及怎样使用LIKE操作符进行通配搜索 LIKE操作符 百分号(%)通配符 select prod_id,prod_name from pro ...

  9. 你真的了解 RSA 加密算法吗?

    作者:小傅哥 博客:https://bugstack.cn 源码:https://github.com/fuzhengwei/java-algorithms 沉淀.分享.成长,让自己和他人都能有所收获 ...

  10. Vue中关于数组与对象修改触发页面更新的机制与原理简析

    Vue中关于数组与对象修改触发页面更新的机制与原理简析 相关问题 数组 使用索引直接赋值与直接修改数组length时,不会触发页面更新. 例如: <script> export defau ...