我终于也要学可持久化了QwQ
膜WJMZBMR论文
———————————— 线 割 分 是 我 >ω< ——————————————————————–
数据结构的可持久化,就是把一个数据结构的历史状态全都保存下来,从而能够快速查找之前出现过的某个操作的结果。当然这必然会带来很大的时间和空间消耗,因此优越的可持久化都会充分利用数据结构历史状态里的相似部分来减少时间和空间复杂度。
显然有一个很裸的可持久化姿势:对数据结构中的每一个节点内嵌一个数据结构(比如平衡树或者STL里那些东西),然后以时间为关键字维护历史状态(显然会让时间复杂度里多一个log).
只看可持久化线段树和平衡树就好了吧= =
我们来学一点姿势(o゜▽゜)o☆
线段树的可持久化
显然我不能对他搞个平衡树一段段区间往里面扔…
首先查询没什么好说的,还是跟普通线段树的查询姿势一样(就是查询有了一个不同的版本而已).重要的就是修改.
简单的单点修改的话,只需要对每个节点修改前,先新建出一个节点,让这个节点记录下当前节点的状态,再对新建的节点修改就好了(??????)??对线段树来说,修改一个点要访问的节点个数不过是log(n)个而已,所以每一次修改也只会新建出log(n)个新节点.
接下来就是区间修改+标记了.
标记下放时对两个孩子节点分别建立新节点然后做单点修改的方式修改,而父节点并不需要(因为下放标记并不需要修改到他).
那标记要如何建立呢?
很简单,当前节点如果被全部覆盖,那就建一个节点修改一下打上标记就好了;如果当前节点没有被全部覆盖,那就把他的子节点里被全部覆盖的那个新建节点修改打标记.
线段树的可持久化实现起来好像很简单代码很短的样子www
可持久化平衡树
我并不想学TreapQAQ
会sbt,Splay然而都不能加可持久化233
还是滚粗吧
版权声明:本文为博主原创文章,未经博主允许不得转载。