珂朵莉树(ODT)
珂朵莉树(又称ODT,Old Driver Tree),可以用来解决一类有区间赋值并且数据随机的问题。
其实ODT就是两个主要函数(\(Assign\)和\(Split\) 操作),时间复杂度的保证其实也都来源于此,其他所有的操作都是直接暴力解决。特别要注意的是,此题一定要有区间整体赋值操作,不然\(Assign\)用不上啊也就谈不上复杂度保证了。
还是回忆一下来对自己做一个巩固吧。
首先,ODT其实就是一个\(set\),只不过里面存的是一个结构体,然后结构体里存三个信息:\(l,r,val\),表示左右区间以及这个区间每个元素的权值(都是相同的)。
然后就是两个关键函数:
- \(Split(pos)\)
表示找到\(pos\)所在的区间\([l,r]\),并把\([l,r]\)分裂成\([l,pos-1]\)和[pos,r]两个区间,最后返回后者的迭代器。此操作保证了我们可以精确的对题目每个询问进行操作(因为不可能每个询问操作都与你当前分好的区间端点完全重合)。
- \(Assign(l,r,x)\)
好的,现在题目要求你把一段区间赋值为同一个数,那不正是ODT的每个节点直接存储的值吗,那我们现在就把\([l,r]\)变成一个节点不是更好,以后全部当做一个点处理,然后在不得已的时候\(Split\),这正是ODT的核心思想。
- 例题:
- CF896C Willem, Chtholly and Seniorious (不想写题解了,真的就是板子,上面的那篇博客特别清楚)
由于博主比较菜,所以有很多东西待学习,大部分文章会持续更新,另外如果有出错或者不周之处,欢迎大家在评论中指出!