线段树之区间第k大查询 C/C++
一、思路+代码
我们都知道线段树中每个结点都维护着序列上的某个区间的某种信息,可以是维护区间最值、区间和、最大公约、最小公倍等。那么区间第k大该怎么维护呢?简单思考一下:要想求区间第k大,最方便的方法是先使该区间有序,这样就可以直接O(1)输出第k大了!
对的!拿到线段树上就是:让线段树中各个结点去存放对应子区间排序后的序列!当查询的某个区间上第k大时,就将线段树中维护范围属于该区间的结点拿出来,将这些结点中的有序序列合并成一个完整的待查询区间的有序序列(这步怎么完成呢?即,如何将多个有序的子序列合并成一个大的有序序列?那就是归并排序了呗!),然后O(1)输出第k大就行了。那么该如何实现这样的线段树呢?我们会发现每一个父结点存放的有序序列,都是由其左右孩子结点存放的有序序列合并而成的,根结点存放最大区间[0,n-1]上的有序序列,