权值线段树(含动态开点)

本文介绍了权值线段树的基本概念和作用,重点在于它如何在log n的时间复杂度内解决第k大或第k小的问题。通过实例展示了权值线段树的构建过程,并阐述了求第k大元素的策略。此外,还提及了动态开点的概念,这是一种节省空间的优化方法,允许在需要时才添加节点。
摘要由CSDN通过智能技术生成

前言:所谓权值线段树,其实是很简单的一个数据结构,它通常用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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值