珂朵莉树

\(\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. C# RulesEngine 规则引擎:从入门到看懵

    说明 RulesEngine 是 C# 写的一个规则引擎类库,读者可以从这些地方了解它: 仓库地址: https://github.com/microsoft/RulesEngine 使用方法: ht ...

  2. 三、Kubernetes调度

    一.Kubernetes调度 Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上.听起来非常简单,但有很多要考虑的问题: 公平:如何保证每个节点都 ...

  3. Nginx实用配置-2

    Nginx配置-2 1.升级Openssl [root@rocky8 ~]# nginx -V #查看现在nginx的OpenSSL版本和编译情况 nginx version: nginx/1.22. ...

  4. mycat搭建

    搭建mycat 一.准备工作 1.确保jdk已安装成功,并且jdk版本选用1.7以上版本 2.准备一台新的主机mysql_mycat放到master的前面做代理 mycat ip 192.168.23 ...

  5. docker搭建ddns

    ddns 容器 https://hub.docker.com/r/chen... https://github.com/honwen/ali... docker pull chenhw2/aliyun ...

  6. 《吐血整理》高级系列教程-吃透Fiddler抓包教程(34)-Fiddler如何抓取微信小程序的包-上篇

    1.简介 有些小伙伴或者是童鞋们说小程序抓不到包,该怎么办了???其实苹果手机如果按照宏哥前边的抓取APP包的设置方式设置好了,应该可以轻松就抓到包了.那么安卓手机小程序就比较困难,不是那么友好了.所 ...

  7. 嵌入式-C语言基础:指针偏移打印数组

    在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的: #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; ...

  8. 【深入浅出 Yarn 架构与实现】3-2 Yarn Client 编写

    上篇文章介绍了编写 Yarn Application 的整体框架流程,本篇文章将详细介绍其中 Client 部分的编写方式. 一.Yarn Client 编写方法 本篇代码已上传 Github: Gi ...

  9. JSP利用AJAX实现页面即时校验验证码

    在JSP页面实现验证码校验文章中当时是使用的Servlet类来进行的验证码校验,但是这种方式并不能即时校验,在正常情况下都是直接在用户输入之后就进行校验,这样对用户来说很方便的. AJAX 即&quo ...

  10. i春秋Zone

    打开网页是个简单的表单填写, 尝试注入....没用 查看源码,没找到什么有用的信息 只有抓包了 发现一个cookie的login值为0,改为1试试 没什么特别的回显,但这应该就是登录与否的判定了,所以 ...