前言

\(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中清除原来的区间,并将新的区间插入setreturn 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裸题)(正解是线段树)。

转载于:https://www.cnblogs.com/chenxiaoran666/p/ODT.html

神奇的暴力数据结构——ODT相关推荐

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

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

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

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

  3. 珂朵莉树(odt老司机树)

    传送门 题意:对于一段区间一共有四种操作: 题解:珂朵莉树板题 珂朵莉树,又称Old Driver Tree(ODT).是一种基于std::set的暴力数据结构. 关键操作:推平一段区间,使一整段区间 ...

  4. NOIp系列题目及CF小结

    长期更新中2333 2018/7/2 先看一下昨晚的cf Codeforces Round #493 (Div. 2) A. Balloons 这个题...直接模拟233 B. Cutting 来一下 ...

  5. 一种黑科技:珂朵莉树

    首先要明白的是:珂朵莉树(ODT)是一种用来骗分的暴力数据结构. 珂朵莉树的思想是利用集合set,把相同且连续的元素合并为一个个区间,从而进行区间修改:因此,珂朵莉树是区间的集合,这点可以通过定义结构 ...

  6. codeforces 915 E 896 C 珂朵莉树

    珂朵莉树(Chtholly Tree),一种基于std::set的暴力数据结构,是由某毒瘤在2017年的一场CF比赛中提出的数据结构,原名老司机树(Old Driver Tree,ODT).由于第一个 ...

  7. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...

  8. 阅读开源源码的正确姿势建议

    关于如何阅读开源社区源码,最近陆续有同学过来问我这个问题.前段时间,在HBase技术交流群里,大家也讨论过一些零散的方法,但都不系统.借着这个问题,我也认真回顾了一下自己所用过的一些方法,觉的有必要整 ...

  9. 【NOIP2013模拟联考6】选课(select)

    Description 你真的认为选课是那么容易的事吗?HYSBZ的ZY同志告诉你,原来选课也会让人产生一种想要回到火星的感觉.假设你的一周有n天,那么ZY编写的选课系统就会给你n堂课.但是该系统不允 ...

最新文章

  1. 实现计算机界“大满贯”,芮勇博士再获技术成就大奖
  2. 数据切分——Mysql分区表的管理与维护
  3. Spring Web MVC是什么
  4. 【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案
  5. ASP调用.Net dll
  6. 基于BISS0001构成的热释电红外延时照明控制器电路图
  7. 送书 | 数据分析如烹小鲜
  8. JDBC连接SQL Server 2005问题
  9. Twitter 有权删除去世用户的账号吗?
  10. ubuntu服务器设置_Ubuntu服务器设置–安全最佳实践
  11. kubeadm部署单Master节点kubernetes集群 1.21.0
  12. lpx寒假作业案例8
  13. 【mpich2】图文教程:mpich2的安装、配置、测试、vs配置、命令行测试(没有使用)
  14. 美化桌面软件测试面试题,软件测试面试题的经典逻辑题
  15. GaRy-Liang的linux成长日记2-系统安装
  16. php上传二进制数据流
  17. C语言教程(五):选择结构
  18. thinkpad X1catbon2019款装系统时无法U盘启动解决办法
  19. 谷歌上面滚动条有时候不管用_可以用的谷歌图片搜图软件
  20. pytorch .detach() .detach_() 和 .data用于切断反向传播

热门文章

  1. 自制月球灯第一期之无线充电篇
  2. 通过js获取谷歌浏览器版本
  3. GLSL里的矩阵对向量的乘法与OpenGL里用数组生成矩阵进行向量乘法的非直觉不一致
  4. Unity:Firebase接入Apple登录
  5. 数组的降维与升维方法
  6. 0.0.0.0/0是什么意思
  7. 计算机丢失lzma.dll,修复7z lzma.dll
  8. 一文读懂Soul上市:注册用户破亿,上市是福还是祸?
  9. (阅读笔记)SecureNN: 3-Party Secure Computation for Neural Network Training
  10. 下载好看的壁纸,这几个网站就够了