区间第K值

来源:互联网 发布:查询行业数据的网站 编辑:程序博客网 时间:2024/05/21 11:02

题目

这应该是很经典的题目了,所以就不再阐述了。

解法:

二分+分块

首先,因为在一个区间中,比某一个数小的数的数量应该是随着值得增大而增大的,所以看到线性,就可以二分了。但是首先还得先预处理一下,因为求得是不同的区间,所以直接处理整个区间是不行的。那么就不难想到用分块来预处理一个小区间的情况,之后扫过来就比较快了。
但是分块的复杂度是比较高的,所以这个题目用分块的方法是只能写部分分的。并且分块需要注意离散化(可能是因为我是蒟蒻),因为一个数是可以重复的,所以说它可以当做很多个第i值。

二分+线段树

在某种意义上来说,线段树和分块是差不多的,只是包装了一下,总的思路还是差不多的。

二分+归并树

这个写法我还没有写,但是它就是用归并排序+线段树,就好了。

主席树

这个写法是比较重点的一个写法。主席树还是比较玄学的,我看了两个小时才看懂。主席树其实就是一个线段树,但是它每一次的更新状态只用记录包含他区间的节点。先离散序列的权值,建一颗空的权值线段树。再把序列中的元素依次加入到树中,加入每个元素A[i]时,维护序列[1,i]的权值线段树。序列中的每个点,都能找到一棵对应前缀权值线段树。离散是来记录连续区间的。
主席树的复杂度比较低,所以写这个题那些无良管理员也是卡不掉的(我的分块就被卡了)。如果理解的话,就是比较优雅的。

原创粉丝点击