权值线段树
首先要会线段树
权值线段树可以近似理解为一个桶,每个叶子节点维护的是当前维护的数的出现个数,每个节点维护的是当前节点维护的区间的数的个数。
例如: 1 1 2 2 3 3 4 4
维护点1的叶子节点的值为2,维护区间[1,2]的节点的值为4。
主要操作和正常线段树一模一样(
懒狗摸了,不贴代码了
权值线段树求区间第K大值
O(logn)
如果K比当前节点右儿子大,当前节点的右儿子所有值都比左儿子大,说明第K大值在左儿子中,且K要减去右儿子维护区间的值,因此问题就转变为在一个新的区间中求一个新K大值的问题;如果比当前右儿子小,即第K大值在右儿子维护区间中;递归即可。