珂朵莉树(ODT)

我学习的时候看的blog

珂朵莉树(又称ODT,Old Driver Tree),可以用来解决一类有区间赋值并且数据随机的问题。

其实ODT就是两个主要函数(\(Assign\)\(Split\) 操作),时间复杂度的保证其实也都来源于此,其他所有的操作都是直接暴力解决。特别要注意的是,此题一定要有区间整体赋值操作,不然\(Assign\)用不上啊也就谈不上复杂度保证了。

还是回忆一下来对自己做一个巩固吧。

首先,ODT其实就是一个\(set\),只不过里面存的是一个结构体,然后结构体里存三个信息:\(l,r,val\),表示左右区间以及这个区间每个元素的权值(都是相同的)。

然后就是两个关键函数:

  1. \(Split(pos)\)

表示找到\(pos\)所在的区间\([l,r]\),并把\([l,r]\)分裂成\([l,pos-1]\)和[pos,r]两个区间,最后返回后者的迭代器。此操作保证了我们可以精确的对题目每个询问进行操作(因为不可能每个询问操作都与你当前分好的区间端点完全重合)。

  1. \(Assign(l,r,x)\)

好的,现在题目要求你把一段区间赋值为同一个数,那不正是ODT的每个节点直接存储的值吗,那我们现在就把\([l,r]\)变成一个节点不是更好,以后全部当做一个点处理,然后在不得已的时候\(Split\),这正是ODT的核心思想。

  • 例题:
  1. CF896C Willem, Chtholly and Seniorious (不想写题解了,真的就是板子,上面的那篇博客特别清楚)
posted @ 2020-06-10 21:04  With_penguin  阅读(375)  评论(0编辑  收藏  举报