有一个 UNSORTED 数字序列:a1,a2,...,an
而且,我们有一个数字,我所以我们有 ai
我们想要找到数字,j j<i
和aj>ai
像这样:
3,4,9,1,8,10,2,2,6,1
if i=8 then j=6
if i=7, j=6 again
if i=10 then j=9
if i=1 then j=NIL (Not In List)
答案 0 :(得分:1)
可以使用Segment tree在每个查询的O(n)预处理和O(log n)中执行此操作。
每个查询在O(log ^ 2 n)中执行它非常简单。首先,构建一个支持在O(log n)上的段上获得最大值的段树。其次,对每个查询进行二分查找。
我表示max(a_i, ..., a_j) as max(i, j)
。假设查询索引为i
。如果max(i+1, n) <= a_i
那么显然没有这样的元素。否则,您必须找到j
这样的最小max(i+1, j) > a_i
,这是通过j
上的二进制搜索完成的。
为了进一步改进,您需要深入研究分段树结构。我会给你一个基本的想法。假设您必须在数组中找到大于x
的第一个元素。最初,您位于细分树的根部。如果左子树的最大值为> x
,则转到左子树,否则转到右侧。可以很容易地显示完成的叶子对应于数组中最左边的元素> x
。