更新不一致时的段树延迟传播最大查询

时间:2016-09-10 11:39:46

标签: arrays algorithm segment-tree rmq lazy-propagation

我在片段树的延迟传播方面遇到了问题。 我有一个长度为N的数组 A ,数组较小(最大长度为20)。 我还有一个索引数组 B ,指的是我目前在数组 Ai 中指向的索引。

有2个操作,: a)更新给定范围的 B 指针以指向下一个元素。 b)在给定范围内打印指针当前指向的最大值。

例如: -

 int[][] array=
{
    {1,2,3,4},
    {8,4,0,0},
    {3,4,2,5}
};
int[] B={1,1,1};

在对范围1,2进行查询时,max为8。 这是因为数组B的指针指向数组的第一个元素。所以我们使用的是1.8。

在查询2,3 max = 8时; 这是因为我们正在使用值8,3。 一般来说,

int max(int[][] arr,int[] b,int l,int r){ 
    int max=0;
    for(int i=l;i<=r;i++){
        max=Math.max(max,arr[i][b[i]]);//using java Math class here
    }
    return max;
}
void update(int[] b,int l,int r){
    for(int i=l;i<=r;i++){
       b[i]++; 
    }
}

这两种方法的形式非常简单。 然而,由于大的输入约束,我需要一个O(logn)查询和更新时间。这就是为什么我想到使用段树(目前它的复杂性是O(n ^ 2)。但是我似乎无法弄清楚如何以延迟传播更新中间节点。

任何见解都会有所帮助。 此外,如果您可以在线链接任何类似的问题,它将是非常有用的,因为我不能(我不知道任何这样的,这不是来自任何网站)。 谢谢你的帮助。

注意:如果b[i]>a[i].length,请将a[i][b[i]]替换为1。

0 个答案:

没有答案