【发布时间】:2016-12-27 05:45:26
【问题描述】:
鉴于以下问题:
有一个由k个整数组成的序列,命名为s,其中可以有2个操作,
1) 总和[i,j] - s[i]+s[i+1]+...+s[j]的值是多少?
2) 更新[i,val] - 将 s[i] 的值更改为 val。
我相信这里的大多数人都听说过使用累积频率表/fenwick 树来优化复杂性。
现在,如果我不想查询总和,而是想执行以下操作:
产品[i,j] - s[i] * s[i+1] * ... * s[j]的值是多少?
新问题一开始似乎微不足道,至少对于第一个操作 Product[i,j]。
假设我正在使用一个名为 f 的累积产品表:
- 乍一看,当我们调用 Update[i,val] 时,我们应该将 f[z] 处的累积积除以 z 从 i - > j 乘以 s[i] 的旧值,然后乘以新值。
-
但如果 s[i] 的旧值为 0,我们将面临 2 个问题:
除以 0。但这很容易通过检查 s[i] 的旧值是否为 0 来解决。
任何实数与 0 的乘积为 0。此结果将导致从 f[i] 到 f[j] 的所有其他值0. 所以我们无法成功执行Update[i,val]。这个问题并不是那么微不足道,因为它会影响除 f[i] 之外的其他值。
有没有人知道如何实现支持上述两种操作的累积产品表?
【问题讨论】:
标签: algorithm cumulative-frequency