珂朵莉树,又名老司机树(Old Driver Tree,ODT),是一种暴力数据结构,是由数据结构毒瘤、Ynoi 出题人 lxl 发明的一种对随机数据十分有效的暴力数据结构。这里使用 set
实现的珂朵莉树时间复杂度为 O ( n log n log n ) O(n\log n\log n) O(nlognlogn)。
珂朵莉树主要应用于区间的“推平”操作,就是对一个区间内的所有值进行修改。当然不局限于单一的推平,可能还有其他操作,这时我们就需要用到珂朵莉树。
考虑一下,我们把几个区间推平之后,整个序列就会变成好几段有相同数的区间:
5 5 5 | 5 5 5 | 42 42 42 | 42 42 42 | 42 42 42 | 42 42 42 | 2 2 2 | 3 3 3 | 3 3 3 | 3 3 3 |
---|
我们用一个结构体来表示每个数字相同的段:
struct node
{
int l,r;//左右端点
mutable int v;//区间值
friend bool operator < (node a,node b)
{
return a.l<b.l;//按左端点排序
}
};
这样处理过后我们把每一段区间插入到一个 set
中,set
根据我们重载的运算符排序,这样我们的序列就维护好了,set
里存储的东西如下:
l = 1 l=1 l=1 r = 2 r=2 r=2 v = 5 v=5 v=5 |
l = 3 l=3 l=3 r = 6 r=6 r=6 v = 42 v=42 v=42 |
l = 7 l=7 l=7 r = 7 r=7 r=7 v = 2 v=2 v=2 |
l = 8 l=8 l=8 r = 10 r=10 r=10 v = 3 v=3 v=3 |
---|
开始时,我们每段只有一个数,set
里维护 n n