最初のポイント:合併は、セグメントツリーヒューリスティックマージではありません。
このデータ構造を挿入する通常の方法に従って小さなデータ構造、一つ一つが暴力に入る:ヒューリスティックは、コンテンツがについてです合併しました。
セグメントツリーの合併は明らかにこの事ではありません。
問題を解決するための問題を解決するには吸うので、長時間の遅延。
開始位置、作用の持続時間、色:操作ごとに、それが唯一の3つのパラメータを有しています。
個別の色とその番号が1E5内に分配しましょう。それはそれのいくつかは少し面倒、ディスクリートではないかもしれません。負の数があることに注意してください。
今、私たちは1つがボールの最初の出現の数である、二つの重量を維持ツリーライン、下の対象のための時間間隔を維持し、他はすべての小さなボールの数です。
我々は、ベクトル演算のセットは、このノードに格納されていると発生/カラー二つのパラメータに必要な蓄積時間を開きました。
私達はちょうど直接ベクトルの開始位置に入れてすべての操作を読み始めました。
その後、再び解決DFSそれに答えることができます。各ポイントで実行しているとみなさ。
1)再帰的なソリューションすべてのサブツリー
2)得られた本ノード回答のすべてのノードに対してこの操作を解決します
3)すべてのイベントは、親ノードへのアップロードに関連付けられています
これは実際に暴力的なアイデアです。
上記の考え方に基づいている場合、考えてみましょう、またはツリーラインを空にする必要がある、またはオープン100 000ツリーバーストメモリです。
最初は、最適化されたとみなすことができます。
ノード1は、操作番号を含む二人の息子、99995ノード2を有する場合、5つのノード番号3があります。
また、ツリーラインを空に?あなたは、任意のアイデアがありますか?
暴力のアップロードの複雑さが高くない第3ノードの場合、キーは、第二ノードに対処する方法です。
米国特許第3ノード、空にし、次に2番ノードの最初の掃引は、情報がクリアされない場合、イベントはまた、一時的にアップロードしていません。
だから、戻って第一のノードに、我々はすでに既製のセグメントツリー99の995操作のための保存を持っていますが、唯一の5ベクトル演算を挿入する必要があります。どのように素晴らしいです
親はただ一点であるため、サブツリーはたくさんポイントを持っているかもしれないが、その息子は、多くのアクションを集めることができます:この質問を考えてみましょう。
次に、各ノードのために、私たちはその重息子のために「最もサブツリーオペランドの息子」と呼んでいます。
さて、DFSの上部の処理をサブ最適化の一例思考のこの行に記載の方法。
1)ベクターの量で親ベクター、空のツリーラインにすべての時間を彼の息子、光を、光のすべての人の息子を掃引。
2)イベント内のセグメントツリー、一時的に再加入息子のベクターを保持する、重い息子を解決します。
すべてのツリーラインが答えを解決する、イベントのツリーラインに挿入された内部3)ベクターが挿入されています。
しかし、最後にアップロード空にし、情報を達成するために私のコードは、コードの問題への統合ソリューションのために、それをDFSの少し変更します。
1)エサウは彼の息子を軽蔑しました。
2)重いスイープ息子。
すべてのツリーラインが答えを解決する、イベントのツリーラインに挿入された内部3)ベクターが挿入されています。
4)現在のノードがその親ノードの重い息子ではない場合、それは木のラインは明らかである、ベクトルは、アップロードされました。
実際には、本質的には同じ、私の個人的な感情は非常によく理解しています。
思考のこのラインは、まだ十分に成熟していない上しかし、いくつかの特定の実装の複雑さが違いを作るためにいくつかの時間を持っているがあります。
最初は重い息子を取得する方法です。これは、DFSが再び掃引、非常に簡単です。呼ばれるこの機能を終了忘れないでください!名前の呉の名前はワード愚か者と同じであるようにしないでください。
1 空隙 pre_dfs(int型 P、int型FA){ 2 SIZ [P] = V [P] .size(); 3 用の(int型 I = FIR [P]; I; I = L [I])IF(TO [ !I] = FA){ 4 にpre_dfs([I]、P)、SIZ [P] + = SIZ [する[I]]; 5 IF(SIZ [する[I]]> SIZ [HSON [P] )IHS [HSON [P] = 0、HSON [P] [I]に、IHS = [I]に] = 1 ; // HSON [P]、P堆積量息子、IHS [P] Pか否かを示します親ノードの子の重み 6 } 7 }
次に、どのようにベクトルデータのアップロードがあります。極端なケース考えてみましょう:チェーン100000を、最後のポイントに10万イベントがあります。
明らかに暴力的なイベントは、なぜヒューリスティックマージされ、その複雑さの保証nlog合併があった犬T、にアップロードされます。
1つの 空隙アップ(int型 P、INT FA){ 2 IF(V [ REF [P]]。サイズ()<V [ REF [FA]。サイズ()){//小さい内側大に一つずつ挿入 3 用の(int型 I = 0 ; Iは、V [< REF I ++は、[P]]サイズ())V [ REF [FA]一back(Vの[ REF [P]] [I]); 4 Vを[ REF [P]]クリア();. //空ではなく、必要に応じて、メモリの爆発を防止するために、 5。 } 6。 他 { ため(int型 I = 0 ;私はVを< REF [FA]。】サイズ(); +私は+)V [ REF[P]一back(Vの[ REF [FA] [I]); V [ REF [FA]クリア();. REF [FA] = REF [P];}
//それが親ノードのベクトルである場合ベクトルノードは子ノードに注いだ後、息子よりも小さく、次いで父親は、我々は、ノードがもはやFA対応するベクトルv [FA]であるが、それは、代表的な要素を修正するべきではないV [P-] 7 }
次のセグメントは、ツリーを実装する必要があります。tはボールアレイの総数を表すもの、Cは配列を表す(すなわち、色の最初の発生のそれぞれにおけるボールの数)は、ボールの数に寄与します
変更された最初は、私たちは、あなたが増減する必要がまだツリーラインクリアする必要があり(特定をし、そう言うだろう)
1つの 空隙インサート(int型 P、int型の POS、int型 TT、int型CC){ 2 であれば(CL [P] == CR [P]){T [P] + = TT; C [P] + = CC。返す;} 3 であれば(POS <= CR [P << 1 ])を挿入した(p << 1 、POS、TT、CC)を。 4 他の挿入(P << 1 | 1 、POS、TT、CC)。 5 T [P] = T [P << 1 ] + T [P << 1 | 1 ]、C [P] = Cを[P << 1 ] + C [P << 1 | 1 ]。 6 }