【发布时间】:2014-06-03 21:40:09
【问题描述】:
从大小为N 的零数组A 开始,给定add(A[i, j], k) 形式的范围查询列表(i <= j 和k > 0),我们对每个元素执行一系列K 操作- 也就是说,对于子数组A[i, j] 中的每个元素,添加值k。应用所有这些范围查询后,找到数组中的最大值。
通过构造一个数组、评估每个查询并找到最大值,这很简单。例如,
A = [0 for _ in range(N)]
for i, j, k in queries:
for idx in range(i, j + 1):
A[idx] += k
max(A) # Solution
但是这个解决方案具有复杂性O(NK),对于大型N 和K 来说相当慢。有更好的解决方案吗?我一直在研究分段树作为一种可能的方法,但看不到明确的方法。
【问题讨论】:
-
对范围端点进行排序并从左侧扫过,当你到达一个范围的开始时添加,当你到达结束时减去。