权值线段树
是什么
权值线段树也是一棵线段树,但是它与普通线段树有所区别:
普通线段树记录的是一段区间 [l,r] 中的a[l]~a[r]的某种信息(如sum,max,最大连续子段和等),其叶子节点为a[i]。
权值线段树记录的是区间l~r每个数字出现的次数和,其叶子节点为 i 在数组a中出现的次数。
做什么
简单来看,权值线段树可以非常方便地查询一段区间的数字出现的次数。
引申出它还可以查询x在全局中的排名(最小)、查询x的前驱(小于x的最大数)和后继(大于x的最小数)。
此外,它还有一个重要功能,就是可以用来查询区间第k大(小)值。
而且权值线段树本质是一个桶,桶能做到的它也可以完成且速度更快。
怎么做
插入删除
void update(int p,int l,int r,int x,int DO)//删除或增加一个x
{
t[p]+=DO;
if