普通线段树
这种线段树是我们最常接触的,其叶子节点维护的是区间信息,比如区间和、区间最大值、区间最小值;
权值线段树
权值线段树其叶子节点表示某个值出现的次数;
由于值域范围通常较大,权值线段树会采用离散化或动态开点的策略优化空间;
利用权值线段树可以方便地求出整体第 k k k大或者第 k k k小
查询第 k k k大的时候,如果右子树的总和大于等于 k k k,那么就说明答案在右子树,否则在左子树;
去搜左子树的时候,我们需要用 k k k减去右子树的大小;
同理,查询第 k k k小的时候,如果左子树的总和大于等于 k k k,那就说明答案在左子树,否则去右子树;
去搜右子树的时候,我们需要用 k k k减去左子树的大小;
权值线段树&普通线段树区别
权值线段树按值域开空间,维护的是个数。
简单线段树按个数可开空间,维护的是特定信息。
主席树
之前我们知道了,权值线段树可以求解全局第 k k k大或者全局第 k k k小;
那如果我们想求解某个区间的第 k k k大或者第 k k k小呢?
我们发现,权值线段树是可以加减运算的,有类似前缀和的性质;
比如我们拿插入了b以后的权值线段树
减去插入a之前的权值线段树得到的权值线段树
得到的权值线段树就相当于只插入a到b之间的数的权值线段树