主席树详解——区间的权值线段树

为啥叫主席树?

很多人一看到这名字觉得这肯定是个很厉害的数据结构,从而望而却步。
其实为啥这个数据结构叫主席树呢,emmmm…
在这里插入图片描述
这个数据结构是这位同学在考场上想出来的,而他的名字与某位主席缩写有一致的相似性QAQ


引入题(静态区间第k小)

题目描述

如题,给定 n n n 个整数构成的序列,将对于指定的闭区间查询其区间内的第 k k k 小值。

输入格式

第一行包含两个正整数 n , m n,m n,m,分别表示序列的长度和查询的个数。

第二行包含 n n n 个整数,表示这个序列各项的数字。

接下来 m m m 行每行包含三个整数 l , r , k l, r, k l,r,k , 表示查询区间 [ l , r ] [l, r] [l,r] 内的第 k k k 小值。

输出格式

输出包含 k k k 行,每行一个整数,依次表示每一次查询的结果

输入输出样例
输入 #1

5 5
25957 6405 15770 26287 26465
2 2 1
3 4 1
4 5 1
1 2 2
4 4 1

输出 #1

6405
15770
26287
25957
26287


想想怎么解决这题

唔好像只会暴力

如果简化一下

先假设每个数值域都在 [ 1 , n ] [1,n] [1,n]
假如每次询问都是问 [ 1 , n ] [1,n] [1,n] 的第 k k k 大,那怎么做呢?(雾似乎直接排序然后输出就好了
但如果我们硬要用数据结构来动态查询呢?我们学过啥?
权值线段树!!!
权值线段树的每个叶子节点代表的是一个数,节点的值是这个数出现的次数。
那么我们每次查找 [ 1 , n ] [1,n] [1,n] 中的第 k k k 大,查询的时候判断一下 k k k s u m [ l s o n ] sum[lson] sum[lson] 的大小,如果 k k k 小,说明 [ l , m ] [l,m] [l,m] 范围内已经有了不止 k k k 个数,说明第 k k k 大肯定在左子树内,于是就往左子树查询第 k k k 大数,否则就往右子树查询第 k − s u m [ l s o n ] k - sum[lson] ksum[lson] 大的数。

问题来了

现在求的不是区间 [ 1 ,

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值