【问题标题】:Find maximal element from range operations从范围操作中找到最大元素
【发布时间】:2014-06-03 21:40:09
【问题描述】:

从大小为N 的零数组A 开始,给定add(A[i, j], k) 形式的范围查询列表(i <= jk > 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),对于大型NK 来说相当慢。有更好的解决方案吗?我一直在研究分段树作为一种可能的方法,但看不到明确的方法。

【问题讨论】:

  • 对范围端点进行排序并从左侧扫过,当你到达一个范围的开始时添加,当你到达结束时减去。

标签: python arrays algorithm


【解决方案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) 内存

【讨论】:

  • 这可能有一个错误,A 应扩展为 [0] * (N+1),具体取决于您对 subarray A[i, j] 的定义是包含还是不包含 j
  • 它是包容性的 - 请参阅问题陈述中的范围:A[i, i] 是有效的
  • 感谢@Knio,这很有意义。
  • 注意:如果N >> K,您可以通过将A的元素(i, v)存储在堆/树/等中来改进此算法为O(K log K)
  • 你的意思可能是 A[j + 1] -= k
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 2022-01-16
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
相关资源
最近更新 更多