【发布时间】:2021-12-13 09:37:20
【问题描述】:
有没有办法获得以下类型的 Q 个不同更新:
v[start] = v[start] + 1;
v[start + 1] = v[start + 1] + 2;
v[start + 2] = v[start + 2] + 3
以此类推..到位置结束
v[end] = v[end] + end - start + 1
在 O(N+Q) 中?
我的意思是像差异数组。你能帮帮我吗?
如果有帮助,数组最初只有 0。
澄清:
N = 数组大小
Q = 更新次数
所有更新都有不同的开始和结束索引,我不需要在更新之间访问数组的任何元素。我只在每次更新后才需要它们。
【问题讨论】:
-
我没有想到任何花哨的东西,但我认为
for循环可以完成这项工作。 -
是的。我一直在寻找 O(Q+N) 的解决方案。而 for 循环将是 O(N*Q)
-
Q 是更新次数。
-
如果初始数组全为 0,那么
std::iota(v + start, v + end, v[start])应该可以解决问题。 -
我很确定您可以跟踪每个索引范围的开始和结束并在之后生成元素,但我无法完全确定细节......我会写用手算出一些这样的总和并寻找模式。