前回の質問「範囲最小クエリアプローチ(ツリーから制限付きRMQまで) 」からの続き(読むことをお勧めします)
繰り返しになりますが、TopCoderに関するこのチュートリアルから、あちこちでいくつか質問があります。誰かがそれらを解決してくれることを願っています。
したがって、RMQ(範囲最小クエリ)問題をLCA(最小共通祖先)問題に変換してから、元に戻すと、単純化された配列を作成できます。(両方の変換はチュートリアルにあり、簡略化された配列は「LCAからRMQへ」で説明されている配列Lです)
とにかく、私はオイラーツアーを使用してその配列を取得できます。これがすべての計算の中心的な部分です。
まず、配列全体を1と-1だけで構成することで、さらに単純にする必要があります。これが私が行うことですLs[i] = L[i] - L[i-1]
。
2番目のステップは実際にはパーティション化であり、それは十分に単純ですが、私を混乱させるこの3番目のステップがあります。
A'[i]をAのi番目のブロックの最小値とし、B[i]をAのこの最小値の位置とします。
Aはこの文のL配列を参照しているため、最小値は常に1または-1になり、複数の1と-1が存在することになります。これで計算が簡単になるとは思わないので、混乱します。
4番目のステップ、
ここで、セクション1で説明したSTアルゴリズムを使用してA'を前処理します。これには、O(N / l * log(N / l))= O(N)の時間とスペースが必要です。
A'が1と-1の記録しか保持しない場合、それに対して何もすることは役に立たないように思われます。
最後のステップ、
テーブルPにインデックスを付けるには、Aの各ブロックのタイプを前処理し、配列T [1、N/l]に格納します。ブロックタイプは、-1を0に、+1を1に置き換えて得られる2進数です。
どういう意味ですか?それぞれの組み合わせを計算するには?のように、000
--..... 001
?
複数の質問のように見えますが、誰かがこれらの最後のステップを案内してくれることを望んでいました。ありがとう!