为啥叫主席树?
很多人一看到这名字觉得这肯定是个很厉害的数据结构,从而望而却步。
其实为啥这个数据结构叫主席树呢,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] k−sum[lson] 大的数。
问题来了
现在求的不是区间 [ 1 ,