歌名 - 歌手
0:00

    主席树(静态区间第k大)

    前言

    如果要求一些数中的第k大值,怎么做?
    可以先就这些数离散化,用线段树记录每个数字出现了多少次。
    。。。
    那么考虑用类似的方法来求静态区间第k大。

    原理

    假设现在要有一些数
    我们可以对于每个数都建一棵新的线段树,用来记录出现每个数字出现了多少次的前缀和。
    那么假设要求区间[l,r]的第k大,将第r棵线段树减去第l-1棵线段树,像上面求所有数的第k大一样来求就可以了。
    但是,对于每一个数都建一个线段树显然会爆空间。
    现在考虑如何节约空间。
    假设现在有四个数1 4 2 3,依次加入,可以这样处理
    这里写图片描述红色线是连到前一棵树的
    由图得,原理就是:
    对于每个被修改的位置,新建一个点。而没有被修改的点与修改前的线段树上的点共用

    posted @ 2018-05-15 22:43  无尽的蓝黄  阅读(474)  评论(0编辑  收藏  举报