我在片段树的延迟传播方面遇到了问题。 我有一个长度为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。