主席树 学习整理
题意:给出1e5个数,向你提5000问,L到R间的第K个数是多少?
主席树,又叫可持久化线段树或者函数式线段树。我只知道这些了,据说是一位大神没学会划分树就自己搞了这么个替代品,结果,比原来的还要强。
说一下思路:
因为是求第k大的数,所以线段树是不行的,因为数是排好序的,所以伸展树好像也不好解决。
所以主席树用到了前缀和的思想,如果知道每个数在L前出现了几次,R前出现了几次,做差就可以在L~R间出现了几次,自然也就知道k大了!
所以,第一步把所有的数排序、去重。
数列:2 4 6 8 8 6 4 2
hash:2 4 6 8
数列变为:1 2 3 4 4 3 2 1(就是各个数在hash中的排序)
第二部建n+1个线段树,就是按照数列的顺序每读入一个数就建一个线段树,把新树在上一颗树的基础上把这个数字按照去重后的排序加入当前线段树。
这样求L~R的k值就用线段树R减去线段树L-1,在差中找k大值就可以了。