当查询数量很高时,如何将大于k的数组范围内的元素替换为k? 鉴于每个查询都是由l r k形式给出的;其中[l ... r]是数组的范围。
答案 0 :(得分:0)
由于我的第一个回答创建了大量评论,我将在新答案中结合所有内容。
我们将使用Segment Tree作为辅助数据结构,用于回答这个问题:范围[l,r]的最小值是多少。最初所有的段树节点都会填充一些“Infinity”数字,这些数字在您的问题中可能是201(因为根据您的评论,所有K都低于200)。
一旦我们读取了输入数组(让我们称之为A),我们将处理查询:
对于每个查询[L,R,K],我们将更新我们的分段树:尝试在范围[L,R]上设置新的最小K.这可以通过使用延迟传播的O(LogN)来完成。这是一个很好的例子http://se7so.blogspot.com/2012/12/segment-trees-and-lazy-propagation.html
现在我们需要构建最终数组。我们迭代我们数组中的每个索引并用A [i] = min(A [i],minimum_on_range(i,i))替换它。这将采取N * Log(N)步骤
该方法的总复杂度为 M * Log(N)+ N * Log(N)