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

ODT(Old Driver Tree)是一种由codeforces用户ODT提出的平衡树数据结构,适用于区间覆盖操作且数据随机的情况。它通过将相同元素的区间合并处理,实现包括初始化、split操作、assign操作在内的功能。此外,还介绍了区间第k小、区间加、区间所有数的k次方和等操作,以及在水题中的应用案例。
摘要由CSDN通过智能技术生成

ODT简介

ODT(old driver tree 老驱动树)又名珂朵莉树是由 c o d e f o r c e s codeforces codeforces上一位叫做 O D T ODT ODT的用户提出的一种基于平衡树的暴力数据结构。
这个数据结构的玄妙之处在于它
并没有稳定的时间复杂度
,因此只有在数据随机/水的情况下才会有较好的表现。

实现前提&&实现原理

前提是必须要有区间覆盖操作数据较随机/水
实现原理:将元素相同的区间推平一起处理,即如果区间 [ l , r ] [l,r] [l,r]中的所有数 [ a l , a l + 1 . . . a r ] [a_l,a_{l+1}...a_r] [al,al+1...ar]全部相同的话就将这个区间的信息用一个节点表示。
从上述描述可以看出这个数据结构是非常暴力玄学

初始化

然后对于每段区间我们可以用一个三元组 [ l , r , v ] [l,r,v] [l,r,v]来表示它的左/右端点和整个区间的值,然后对于这些区间的信息可以用一个 s e t set set来维护。
下面是 O D T ODT ODT节点的初始化代码:

struct Node{
   
	int l,r;
	mutable int v;
	Node(int l,int r=-1,int v=0):l(l),r(r),v(v){
   }
	friend inline bool operator<(const Node&a,const Node&b){
   
		return a.l<b.l;
	}
};
set<Node>S;
typedef set<Node>::iterator It
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值