前言:所谓权值线段树,其实是很简单的一个数据结构,它通常用log n的的时间来求第k大,第k小这样的问题,它自身的实现也是非常简单。
首先我们得了解权值线段树所维护的东西。权值线段树,它每一个区间所代表的,是有多少个数在这个区间内,举个例子。
这就是一棵权值线段树。我们模拟模拟它的过程。
假设有一个数字
3
先加入3,一路往下找到3-3这个节点,加1,返回
1-3这个节点,是由1-2,3-3两个节点组成,所以它的值它们的和。
返回 ,1-6这个节点是1-3,4-6这两个节点的父亲,所以它的值也是它们的和。
很明显了吧?
procedure maketree(t,l,r:longint);
var
mid:longint;
begin
if(l=r)then
begin
inc(tree[t]);
f[t]:=a[i];
exit;
end;
mid:=(l+r)div 2;
if(mid<a[i])then
begin
maketree(t*2+1,mid+1,r);
end;
if(mid>=a[i])then
begin
maketree(t*2,l,mid);
end;
tree[t]:=tree[t*2<