我々は問題からスタート。
一つの問題:数Nが割り当てられている、m個の命令、kの数は、すべての数の最終的な評価を追加するために必要なそれぞれの時間があります。
10 ^ 5 $≤のk≤nの≤$ 1、M。
実際には、この問題は、アレイによってサービスすることができます。
第二の問題:数Nが割り当てられている、m個の命令、毎回第2のX-Yプラス数A、全ての数の最終的な評価に要求された数があります。
$ 1≤X≤Yさ≤N、Mの≤10 ^ 5 $
実際には、このタイトルブロック、ツリーライン、フェンウィックツリーと他のアルゴリズムは、これらの質問の数が多すぎます。
しかし、次の質問を見てください:
3つの問題:数Nが割り当てられている、第2のX-Yプラス数Aにm個の命令、毎回要求された数、全ての数の最終的な評価があります。
$ 1≤X≤のY≤nを、5×10 ^ 6 $ Mの≤
O(nはn個のログを記録)だけでなく、遅く複雑さを持っていたことができない、この範囲が大きすぎる5E6:私たちは、ことがわかりました。
だから、私たちの対象に:違い。
差分
①違いは何ですか?
違いは、加算および照会することによって達成定数複雑マーク技術です。
以下のために一般的に適した静的メンテナンス(添加前にフロント、最終評価)。
②差動どのように使用するには?
私たちはあなたの例をあげます:
列の数があります。
1 。9 2. 8. 6. 5. 4. 3. 7
タグ:0 0 0 0 0 0 0 0 0 //今はタグにマークがありません
今、私たちは、数5プラス2に3番目の数字です。
その後、我々は最初の3つの数字が2に続くすべての番号を起動し、数6からその背後にあるすべてマイナス2番号に始めることができることを発見し、それが数5の第三の数に相当しますプラス2。
それではマーク:
[I]: 1 。9 2 8。 3。 7。 4。 6。 5。 タグ: 0 0 2 0 0 -2 0 0 0 //フラグ* 1マーク
その後、我々はその後、数8に数4マイナス1。
上記の考え方によると、我々は最初の9つの番号1に続くすべての数字で始まる、すべての数字の後ろに、4番からスタートマイナス1することができます。
[I]: 1 9。 2 8。 3。 7。 4。 6。 5。 タグ: 0 0 2 -1 0 -2 0 0 。1 // マークとマーク* 2
コマンドの実行が終了すると仮定し、その後、我々はこれを合計します:
レコード和アレー、タグ番号と前に$持ち込まI $ sum_i代表と。
[I]: 1 9 2 8 3 7 4 6 5 タグ: 0 0 2 - 1 0 - 2 0 0 1
和[I]:0 0 2 1 1 -1 -1 -1 0
最後に、我々は$ sum_i $の和に相当するの$ a_iを$を追加し、答えがあります。
O(N)の時間複雑。