神奇的暴力数据结构——ODT
前言
\(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相关推荐
- [转]我的数据结构不可能这么可爱!——珂朵莉树(ODT)详解
参考资料: Chtholly Tree (珂朵莉树) (应某毒瘤要求,删除链接,需要者自行去Bilibili搜索) 毒瘤数据结构之珂朵莉树 在全是珂学家的珂谷,你却不知道珂朵莉树?来跟诗乃一起学习珂朵 ...
- ODT(old driver tree)详解(带例题)
文章目录 ODT简介 实现前提&&实现原理 初始化 split操作 assign操作 其它操作 区间第k小 区间加 区间所有数的k次方和 几道水题 ODT简介 ODT(old driv ...
- 珂朵莉树(odt老司机树)
传送门 题意:对于一段区间一共有四种操作: 题解:珂朵莉树板题 珂朵莉树,又称Old Driver Tree(ODT).是一种基于std::set的暴力数据结构. 关键操作:推平一段区间,使一整段区间 ...
- NOIp系列题目及CF小结
长期更新中2333 2018/7/2 先看一下昨晚的cf Codeforces Round #493 (Div. 2) A. Balloons 这个题...直接模拟233 B. Cutting 来一下 ...
- 一种黑科技:珂朵莉树
首先要明白的是:珂朵莉树(ODT)是一种用来骗分的暴力数据结构. 珂朵莉树的思想是利用集合set,把相同且连续的元素合并为一个个区间,从而进行区间修改:因此,珂朵莉树是区间的集合,这点可以通过定义结构 ...
- codeforces 915 E 896 C 珂朵莉树
珂朵莉树(Chtholly Tree),一种基于std::set的暴力数据结构,是由某毒瘤在2017年的一场CF比赛中提出的数据结构,原名老司机树(Old Driver Tree,ODT).由于第一个 ...
- P2801 教主的魔法(分块入门)
两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...
- 阅读开源源码的正确姿势建议
关于如何阅读开源社区源码,最近陆续有同学过来问我这个问题.前段时间,在HBase技术交流群里,大家也讨论过一些零散的方法,但都不系统.借着这个问题,我也认真回顾了一下自己所用过的一些方法,觉的有必要整 ...
- 【NOIP2013模拟联考6】选课(select)
Description 你真的认为选课是那么容易的事吗?HYSBZ的ZY同志告诉你,原来选课也会让人产生一种想要回到火星的感觉.假设你的一周有n天,那么ZY编写的选课系统就会给你n堂课.但是该系统不允 ...
最新文章
- 实现计算机界“大满贯”,芮勇博士再获技术成就大奖
- 数据切分——Mysql分区表的管理与维护
- Spring Web MVC是什么
- 【渝粤题库】国家开放大学2021春2072人文社会科学基础(A)答案
- ASP调用.Net dll
- 基于BISS0001构成的热释电红外延时照明控制器电路图
- 送书 | 数据分析如烹小鲜
- JDBC连接SQL Server 2005问题
- Twitter 有权删除去世用户的账号吗?
- ubuntu服务器设置_Ubuntu服务器设置–安全最佳实践
- kubeadm部署单Master节点kubernetes集群 1.21.0
- lpx寒假作业案例8
- 【mpich2】图文教程:mpich2的安装、配置、测试、vs配置、命令行测试(没有使用)
- 美化桌面软件测试面试题,软件测试面试题的经典逻辑题
- GaRy-Liang的linux成长日记2-系统安装
- php上传二进制数据流
- C语言教程(五):选择结构
- thinkpad X1catbon2019款装系统时无法U盘启动解决办法
- 谷歌上面滚动条有时候不管用_可以用的谷歌图片搜图软件
- pytorch .detach() .detach_() 和 .data用于切断反向传播
热门文章
- 自制月球灯第一期之无线充电篇
- 通过js获取谷歌浏览器版本
- GLSL里的矩阵对向量的乘法与OpenGL里用数组生成矩阵进行向量乘法的非直觉不一致
- Unity:Firebase接入Apple登录
- 数组的降维与升维方法
- 0.0.0.0/0是什么意思
- 计算机丢失lzma.dll,修复7z lzma.dll
- 一文读懂Soul上市:注册用户破亿,上市是福还是祸?
- (阅读笔记)SecureNN: 3-Party Secure Computation for Neural Network Training
- 下载好看的壁纸,这几个网站就够了