前言

\(ODT\),即珂朵莉树,又称老司机树(\(Old\ Driver\ Tree\))。

它是一个十分暴力的数据结构,可以用于各种乱搞,也非常的实用。

当然,这全要基于一个基本条件:数据随机

主要思想

\(ODT\)的主要思想就是把一个元素完全相同的区间合并成一个节点,然后用\(set\)维护(我也不知道为什么称其为“树”)。

而在数据随机的情况下,节点的期望个数是很少的,因此复杂度也就比较低。

核心操作: \(Split\)操作

\(ODT\)的核心操作就是\(Split\)操作。

\(Split(x)\)的作用是分裂出一个以\(x\)为左端点的区间

对于这个操作,我们先用\(set\)的\(lower\_bound\)函数,找到左端点不小于\(x\)的第一个区间。

如果此时找到的区间左端点已经为\(x\)了,则直接返回这个区间。

否则,我们就将迭代器移动到上一个位置,而这个区间才是我们要分裂的。

设这个区间为\([l,r]\)。

则我们应将它分裂成\([l,x-1]\)和\([x,r]\)两部分。

所以我们先将\(l,r\)用变量存储下来,然后在\(set\)中清除原来的区间,并将新的区间插入\(set\)。

然后\([x,r]\)这个区间就是我们所要找的,将其返回即可。

这个操作代码如下:

I IT Sp(CI x)//分裂出一个以x为左端点的区间
{
IT t;if((t=S.lower_bound(Il(x)))!=S.end()&&!(t->l^x)) return t;//如果此时找到的区间左端点已经为x了,则直接返回这个区间
RI l=(--t)->l,r=t->r,v=t->v;S.erase(t),S.insert(Il(l,x-1,v));//将迭代器移动到上一个位置,先将l,r用变量存储下来,然后在set中清除原来的区间,并将新的区间插入set
return S.insert(Il(x,r,v)).first;//区间[x,r]就是我们所要找的,将其返回即可
}

推平操作:\(Assign\)操作

显然,光有\(Split\)操作显然会\(T\)飞。

所以我们就需要一个推平操作,把某段区间合并成一个节点。

则我们把这个区间的左端点,以及右端点的下一个位置提出,然后删除它们之间的所有节点(包括左端点但不包括右端点的下一个位置),再把新的节点加入即可。

这个操作代码如下:

I void Assign(CI x,CI y,CI v)//推平操作
{
IT tr=Sp(y+1),tl=Sp(x);S.erase(tl,tr),S.insert(Il(x,y,v));//把这个区间左端点及其之后、右端点下个位置之前的所有节点删除,然后插入新的节点
}

其余操作

其余操作就没什么好说的了,直接暴力扫一遍即可,真是不能再暴力了。

例题

下面给出一道例题:【BZOJ1858】[SCOI2010] 序列操作(ODT裸题)(正解是线段树)。

神奇的暴力数据结构——ODT的更多相关文章

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

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

  2. c++分块算法(暴力数据结构)

    快要noip了,该写些题解攒攒rp了(逃) 看到题解里那么多线段树啊,树状数组啊,本蒟蒻表示:这都是什么鬼东西? 在所有高级数据结构中,树状数组是码量最小的,跑的也基本是最快的,但理解很难,并且支持的 ...

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

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

  4. ODT(old driver tree)详解(带例题)

    文章目录 ODT简介 实现前提&&实现原理 初始化 split操作 assign操作 其它操作 区间第k小 区间加 区间所有数的k次方和 几道水题 ODT简介 ODT(old driv ...

  5. 【模板】珂朵莉树(ODT)(Codeforces 896C Willem, Chtholly and Seniorious)

    题意简述 维护一个数列,支持区间加,区间赋值,区间求第k小,区间求幂和 数据随机 题解思路 ODT是一种基于std::set的暴力数据结构. 每个节点对应一段区间,该区间内的数都相等. 核心操作spl ...

  6. ODT珂朵莉树

    关于ODT,据说是毒瘤lxl发明的,然后毒瘤鱼鱼因为我用ODT误导人D了我一回-- 这是一种基于 \(set\) 的暴力数据结构. 在使用时请注意,没看见这2东西千万别用-- 1.保证数据随机 2.有 ...

  7. [LeetCode] Implement Magic Dictionary 实现神奇字典

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...

  8. bzoj 1201[HNOI2005]数三角形 1202 [HNOI2005]狡猾的商人 暴力 权值并查集

    [HNOI2005]数三角形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 349  Solved: 234[Submit][Status][Disc ...

  9. 「AC自动机」学习笔记

    AC自动机(Aho-Corasick Automaton),虽然不能够帮你自动AC,但是真的还是非常神奇的一个数据结构.AC自动机用来处理多模式串匹配问题,可以看做是KMP(单模式串匹配问题)的升级版 ...

随机推荐

  1. 3.数据校验和SpringEL

    1.数据验证 数据验证不应该被限定在web层去处理,他应该在任何需要做数据验证的地方做验证: 基于以上考虑,Spring设计了一个既方便又可以在所有层使用的Validator接口 Spring提供了V ...

  2. 电脑c盘爆满检查与设置

    C盘文件爆满,先检查是那个文件造成的 操作方法:打开文件夹选项,将“隐藏受保护的操作系统文件(推荐)”前的勾选去掉,然后打开系统盘查看是那个文件占用空间大 Hiberfil.sys文件删除方法: 1. ...

  3. hadoop用put上传文件时报错

    用命令-put上传文件 报错0 datanode(s) running 原因是进行了多次格式化 解决办法: 停止集群 删除在hdfs中配置的data目录(即在core-site.xml中配置的hado ...

  4. nginx —— 理解nginx_upstream_jvm_route模块解决tomcat多节点session不一致问题

    这种方式不需要修改web工程只需要对nginx下载nginx_upstream_jvm_route插件,修改tomcat和nginx配置,就能解决session问题.由于这种方式不会把session存 ...

  5. 2019.03.21 读书笔记 基元类型的Parse与TryParse 性能与建议

    Parse转换失败时会抛出异常,耗损性能,如果转换成功,则与TryParse无差异.查看源码,tryparse的代码更多一些,在失败时,反而性能更优,主要是抛出异常耗损了性能.所以在不确定是用Tryp ...

  6. pat05-图2. Saving James Bond - Easy Version (25)

    05-图2. Saving James Bond - Easy Version (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  7. 导出CSV

    public FileResult ExportExcel() { var sbHtml = new StringBuilder(); sbHtml.Append("<table bo ...

  8. Unity C# 使用JsonUtility读写Json文件

    本文原创,转载请注明出处:http://www.cnblogs.com/AdvancePikachu/p/7146731.html 今天,为大家分享一下unity上的Json序列化,应该一说到这个词语 ...

  9. JQuery中的prop和attr

    prop和attr都可以用来获取并改变对象的属性, 对于HTML元素本身就带有的固有属性,在处理时,使用prop方法. 对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法. 栗子: ...

  10. Echarts学习笔记

    1.Ecahrts使用首先需要引用js文件 Echarts.js 然后定义一个带id的容器(div就可以) 然后就可以初始化echarts了 ↓这是柱形图 <h2 class="con ...