从大小为A
的零数组N
开始,我们对每个元素执行一系列K
操作,给出add(A[i, j], k)
形式的范围查询列表( i <= j
和k > 0
) - 也就是说,对于子数组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
而言,这种复杂性相当慢。有更好的解决方案吗?我一直在研究细分树作为一种可能的方法,但看不到明确的方法。
答案 0 :(得分:1)
A = [0] * (N + 1)
for i, j, k in queries:
A[i] += k
A[j + 1] -= k
v, m = 0, 0
for k in A:
v += k
m = max(m, v)
return m
这是O(N + K)
时间和O(N)
内存