[数据结构] 主席树初识(理论,代码待补)

Posted 鱼竿钓鱼干

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构] 主席树初识(理论,代码待补)相关的知识,希望对你有一定的参考价值。

[数据结构] 主席树初识

前置知识

权值线段树

权值:序列中每个数的值
权值线段树:以权值作为下标的线段树,每个节点上记录的是对应的一段值域中数的出现次数
主要用途是:求序列中一段值域中数出现的个数,查找一个区间的第k大的值

权值线段树->主席树

权值线段树求的是整个数列中某个值域数的出现次数
那么如何求出数列中任意区间中某个值域数的出现次数
即查询[l,r]的[vl,vr]的出现次数
[vl,vr]我们可以用权值线段树处理
[l,r]可以想到前缀和

主席树(可持久化线段树)=前缀和+权值线段树?

朴素的思想,我们可以开N个权值线段树存储不同前缀下的权值线段树。那么会花费空间 N ∗ 4 M N*4M N4M直接内存爆炸。
仔细思考可以发现每次新加入一个节点只会在原来树的基础上改动一部分节点,大部分可以直接接到原来的树上,这就能优化空间消耗了

主席树的本质是节省内存的前缀权值线段树

基本操作及其代码实现

例题

洛谷P3567

洛谷P3834

洛谷P2633

洛谷P3963

以上是关于[数据结构] 主席树初识(理论,代码待补)的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构] 树哈希(待补)

主席树

数据结构之主席树

Yangk's 静态主席树-模板

重码数据结构主席树(可持久化线段树)

浅谈主席树