RMQ(3)主席树

首推文章:https://blog.finaltheory.me/algorithm/Chairman-Tree.html#7865d

求解区间第k大问题

1、权值线段树

我感觉又能叫值域线段树,哈希线段树。。

即对值域建立线段树(需先离散化,不然内存消耗很大,但是这样便不好修改元素了),就像直接对数字哈希一样,hash[i]=3表示有3个i

这样建立后的线段树,所维护的区间和就是该区间的元素个数

那么,便可以借助线段树来二分查找这颗线段树第k大的值了

2、主席树

据说即n颗权值线段树(分别对应着每个前缀,如ROOT[R]表示对前R个元素建立权值线段树)

由于这n颗权值线段树对应的值域是一样的,所以结构也是一样的,那么求解【L,R】的第k大值,只需在每次用到某个区间和时,ROOT[R]的区间和减去ROOT[L-1]的区间和便是【L,R】对应的区间和(好像很绕。。。)

还有,,,当然不能每颗权值线段树都单独建立,不说时间,内存也会爆,所以要合理的利用共用的部分。

这样的话,新建一颗新树的时间也只需log(n)的时间。

另外,显然节点的子节点就可能不是2*k,2*k+1了

尊哥。。

原文地址:https://www.cnblogs.com/lnu161403214/p/8644669.html