首推文章: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了
尊哥。。