珂朵莉,要一直幸福下去哟!
warning:本文在大白天书写,脑子可能不大好用。
目前代码选自题解,等有时间自己写一下。
简介
ODT(Old Driver Tree(中文译名张舟树),又称 Chtholly Tree,即众人皆知的珂朵莉树) 是一种非常暴力的思想或者做法 (注意我没有说是数据结构)
简单来说,其核心思想是把一段区间推平(这也是其适用的地方——区间赋值),推平之后,原数列变成一段一段的了(每段的数值相同),然后就可以搞事了。
ODT 在随机数据下,复杂度近似 O ( m l o g n ) O(m log n) O(mlogn),证明请自行翻参考资料。
前置知识
熟练使用 STL
(至少要熟练使用 set
)或者会写平衡树。
初始化
我们维护一个结构体 n o d e node node,包含 l , r , d l,r,d l,r,d ( d d d 是题目要求维护的值),表示一个被推平的区间。
struct node{
ll l,r;
mutable ll v;
node(ll l,ll r=0,ll v=0):l(l),r(r),v(v){
};
inline operator <(const node &a)const{
return l<a.l;
}
};
有意思的一个结论:只要没有线段被另一条线段完全覆盖,那么按左端点排序后右端点同样有序。
mutable
可以看成 const
的反义词,被 mutable