セグメントツリーの基本----(基本的なデータ構造) - (A)

 1. 定義

はじめに:なぜ使用セグメントツリーではなく、配列はそれをシミュレートしますか?
答えは:配列を行うにはいくつかの問題がタイムアウトしますので、ちょうどOセグメントツリーの時の複雑さ(Nログ())で解決することができます
(だと思う)があり、間違いなくセグメントツリーはデータ構造ではありませんが、それは実際にリンクされたリスト構造ツリー状であります
///または重大なポイント(教科書のコピー)-----------へ/
////////////////////////////////////////////////// ////////////////////
セグメントツリーを定義:セグメントツリーは二分探索木であり、区間木が類似しているが、それは間隔に分割セクション、セグメントツリーの各単位区間に対応するリーフノードを意味します。
2.基礎となるオペレーティング・セグメントツリー
 セグメントツリーの基本的な動作は、に分けられる:{ 1. 2.ツリー構造は、間隔のクエリ間隔最大値と最小値を修正値3 4 5を修正するクエリ点の特定のセグメントのために構築されています6.間隔クエリ間隔及び }
私は、一つ一つを話します........
3.実際のポイント
前提で始まる - ツリーデータ構造を構築する必要があります - 以下の
書式#include <iostreamの> 
の#include <cstdioを>
 に#define MAXN 500000
 使用して 名前空間はstdを、

構造体ツリー
{ 
    int型のL、R。
    長い 長いワット。
    int型怠惰; 
} TR [MAXN * 4 ]。

値の間隔(各ノードの値)を表しwは// lは、rは---、それ自身の詳細は以下を参照の遅延使用し、左右のサブツリーを表します。

各非リーフノードセグメントツリー[B]は、区間[(A + B)で表されるその左側の子のために / 2]、 セグメント[(A + B)/ 2で表される右息子+ 1、B]。したがって、セグメントツリーは平衡二分木であり、子ノードの最後の数はN、即ち、ライン部の全体の長さです。
遭遇する主な問題は:
配列インターバル長の計算を解決するために、ランダムチェンジこの間隔の計算の値とした後に
使用して、セグメントツリー時間の複雑さを低減することができます。- O(N)Oに還元されるから(LOGN)
三つの主要な機能
アレイによれば1、セグメントツリーを作成する(完全なバイナリ0を補完していない)
2の値が更新されたセグメントツリー変更
3.計算LRをそして部
4と特定の操作コード(アルゴリズム)
実績 :我々は、セグメントツリーは二分探索木であることを知っているが、それは思考の二分法を確立して適用されなければならなかった、各ノードは唯一の左部分木と右のサブツリーは、ので、ここでも再帰を使用すると考えられている、特定の確立します次のように
1つの 空隙ビルド(int型 L、int型の R、int型K)
 2  {
 3      TR [K] .L = L。
4つの      TR [K] .R = R。
5      もし(L == R)
 6      {
 7          のscanf(" %dの"、&TR [K] .W)。
8          リターン;
9      }
 10      INT半ば=(L + R)/ 2 11      ビルド(L、中、K * 2 )。
12      ビルド(MID + 1、R、K * 2+ 1 )。
13      P [k]は.W = P [K * 2 ] .W + P [K * 2 + 1 ] .W。
14 }

ここで思考の症状の半ば半分を使用します

再び私は例を与える:1--10は、セグメントツリーを構築する - 図(より良く理解)

ちょうどセグメントツリーデータ構造を、そのノードのそれぞれは、間隔(対応する設定) - で覚え

 クエリー間隔

引用は岩から首長をマーク> https://blog.csdn.net/zearot/article/details/52280189

クエリー間隔を考えることは聞かれる間隔で、比較の範囲になりました、2つのだけの状況を照会する間隔、私たちが知っていることをシミュレートすることは簡単です:私たちは、マップ上でそれを行う--- 1例クエリ2-- --- 6 --- 2クエリ10(この左と間隔と右セクション - 4(左または右の間隔がセットが含まれている意味し、それノードなどの優れた点(範囲)を有しています)。 )交差 - 子供用の靴の優れたコレクションを学ぶことが理解しやすいべきです

具体的なコードは次のことを達成するために

ボイド尋ねる(int型 L、int型の R、int型K)
{ 
    場合(TR [K] .L> = L && TR [K] .R <= R)
    { 
        ANS + = TR [K] .W。
        返します
    } 
    もし(T R [k]は.lazy)
        ダウン(K)。
    INT半ば=(TR [K] .L + T R [K] .R)/ 2 もし(L <= MID)
        (L、R、K尋ねる * 2 )。
    もし(R> MID)
        尋ねる(L、R、K * 2 + 1 )。
    // TR [K] .W = TR [K * 2] .W + T R [K * 2 + 1] .W。
}

さて,,ここで最初のピットストップでのクエリと実績,,基本は、ツリー線以下を参照してください - (基礎となるデータ構造) - ビス

おすすめ

転載: www.cnblogs.com/liuyuhao040610/p/11234546.html