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