この記事を読む前に、暗示的なキーによってデカルトツリーが何であるかを理解する必要があります(これは複数の記事のトピックなので、
ここで読むことをお勧めし
ます )。 スペース圧縮は、データを圧縮するために使用される方法です。 たとえば、セット{1、1、1、2、2、2、2、3、1、1}を保存する代わりに、{1 x 3、2 x 3、3 x 1、1 x 2}を保存します。
次に、この方法を使用してスペースを圧縮し、任意のセグメントでオンライン操作を実行できるようにします。
そのようなツリーの実装をすぐに提供します
struct treap_node { int x, y; treap_node *l, *r, *p; int width; int val;
通常のデカルトツリーと比較して、widthプロパティが構造に表示されていることに注意してください。現在の頂点に格納されているセグメントの幅です。 そして、valは意味そのものです。
別の大きな変更-分割機能
else {
ifの別の部分を次に示します。 これは、セグメントを2つのサブセグメントに分割することを指します。 そして、左右に接着します。
私がこれを使用する問題では、漸近的な動作に影響しないため、マージ関数は変更しません。 このようにして、スペース圧縮の問題を解決し、オンラインでリクエストに応答できます。 原則として、誰かがそれを必要とする場合、関数mergeを書き換えて2つのセグメントを結合することもできます。 すべての可能なデータを読み取り、固定セグメントを指定してから、binpo検索を使用して必要なセグメント数を検索し、セグメントツリーで必要な変更を行う代わりに、同じ漸近線に対して、小さなifで管理します。 確かに、デカルトツリーを使用する必要があります。 私にとっては、これを書くほうがはるかに便利で高速です。 たぶんこれは誰かに役立つでしょう。