次の問題があるとします。
sという名前の k 個の整数のシーケンスがあり、2 つの操作が可能です。
1) Sum[i,j] - s[i]+s[i+1]+...+s[j] の値は?
2) Update[i,val] - s[i] の値をvalに変更します。
ここにいるほとんどの人は、累積度数表/フェンウィック ツリーを使用して複雑さを最適化することについて聞いたことがあると思います。
ここで、合計をクエリしたくないが、代わりに次のことを実行したい場合:
Product[i,j] - s[i] * s[i+1] * ... * s[j] の値は?
新しい問題は、少なくとも最初の操作Product[i,j]については、最初は些細なことのように見えます。
fという名前の累積製品テーブルを使用していると仮定します。
- 最初に考えたのは、 Update[i,val]を呼び出すとき、 i -> j からの z のf[z]での累積積をs[i] の古い値で割り、新しい値で乗算する必要があるということです。
しかし、 s[i] の古い値が 0の場合、2 つの問題に直面します。
0 による除算。ただし、これは s[i] の古い値が 0 であるかどうかを確認することで簡単に対処できます。
実数と 0 の積は 0 です。この結果により、f[i]からf[j]までの他のすべての値が 0 になります。したがって、 Update[i,val]を正常に実行できません。この問題は、 f[i]以外の値に影響するため、それほど単純ではありません。
上記の2つの操作をサポートする累積製品テーブルをどのように実装できるか考えている人はいますか?