初心者の方なら、このブログを見てください.よく書けています.
目次
HDU 1166敵兵布陣(線分樹)
HDU 1698 Just a Hook(線分樹)
POJ 3468 A Simple Problem with Integers(線分樹区間修正+加算)
HDU 1540 Tunnel Warfare(最長連続区間+単点修正)
洛谷P 372【テンプレート】線分樹1
洛谷P 373【テンプレート】線分樹2
洛谷P 198[JSOI 2008]最大数(線分樹またはRMQ)
洛谷P 531 I Hate It(線分樹または樹状配列)
2018年全国多校アルゴリズム冬休みトレーニングキャンプ練習試合(第五場)逆序数(樹状配列)
2018年全国多校アルゴリズム冬休みトレーニングキャンプ練習試合(第5回)H Tree Recovery(線分樹)
パワーoj 2821:Y先輩のGCD難題(線分樹区間は最大公因数+区間修正を求める)
区間(interval)(牛客白月戦5)(差動)
POJ 2299 Ultra-QuickSort(樹状配列は逆序数を求める)
HU 4000 Fuit Ninja(樹状配列)
POJ 2481 Cows(ツリー配列)
POJ 1990 MooFest(樹状配列)
POJ 3264 Balanced Lineup(RMQ)
HDU 1166敵兵布陣(線分樹)
問題:線分樹のテンプレートの問題ですが、木の形の配列を使うのはもっと簡単です.ここの前の木の配列のコードです.後ろのは線分樹のコードです.
ツリー配列:
#include
#include
#include
#include
#include
線分樹:
#include
#include
#include
#include
#include
HDU 1698 Just a Hook(線分樹)
この問題は問題を見ても分かります.とても裸の段樹の区間修正の問題です.
#include
#include
#include
#include
#include
POJ 3468 A Simple Problem with Integers(線分樹区間修正+加算)
#include
#include
#include
#include
#include
HDU 1540 Tunnel Warfare(最長連続区間+単点修正)
件名:
操作一:ある村は壊滅された.
操作の2:1つの村の座標を与えて、この村を含む最長の未被村の長さを求めます.
操作三:最後に破壊された村が修復されます.
最初に、私たちは線分樹で最長の連続区間の長さを維持することを考えられます.今は1の代表的な変更点で破壊されず、0で改点が破壊されたことを表しています.そして、前回の破壊点をスタックまたは配列でセットします.そして線分樹メンテナンス1の最長長さです.
#include
#include
#include
#include
#include
洛谷P 372【テンプレート】線分樹1
裸の線分樹.
#include
#include
#include
#include
#include
洛谷P 373【テンプレート】線分樹2
まだ線分樹の裸問題ですが、区間修正の時、彼は一つの数に乗ります.この時、怠け者マークを下に置いて、下に付ける怠け者マークと乗りたい怠け者マークを下に置くのです.
#include
#include
#include
#include
#include
洛谷P 198[JSOI 2008]最大数(線分樹またはRMQ)
これは裸の線分樹とRMQの問題です.ここでこの二つのコードを貼り付けます.
#include
#include
#include
#include
#include
線分樹:
#include
#include
#include
#include
#include
洛谷P 531 I Hate It(線分樹または樹状配列)
裸の線分樹.
線分樹:
#include
#include
#include
#include
#include
2018年全国多校アルゴリズム冬休みトレーニングキャンプ練習試合(第五場)逆序数(樹状配列)
注:裸の配列ツリーは逆の順序を求めるので、行列を宣言して、現在の位置よりも大きな数を記録します.逆の順序数は、ちょうど前に出てくるのが後ろより大きい数です.前に1つの数を入力すると、彼より小さい数の配列をプラスします.最後に直接的に配列の数をプラスすると、前の入力数よりも大きい数の数です.
#include
#include
#include
#include
#include
#include
2018年全国多校アルゴリズム冬休みトレーニングキャンプ練習試合(第5回)H Tree Recovery(線分樹)
#include
#include
#include
#include
#include
パワーoj 2821:Y先輩のGCD難題(線分樹区間は最大公因数+区間修正を求める)
#include
#include
#include
#include
#include
区間(interval)(牛客白月戦5)(差動)
線分樹で作ってもいいですが、それはちょっと面倒です.ここでは差分を使って、このように更新するしかないです.境界ノードです.具体的な思想はコードを見て理解できます.
#include
#include
#include
#include
#include
POJ 2299 Ultra-QuickSort(樹状配列は逆序数を求める)
前にもう似たような問題がありましたが、はっきり言っていません.ここで話したのは比較的詳しいです.
これは離散化が必要です.
一つの構造体を作ってvalとidを含んで、valは入力の数で、idは入力の順序を表します.その後、valによって小さい時から大きい順に並べられます.もしvalが等しいなら、idによって並べられます.逆順がないなら、IDはiと同じであり、逆序数があるなら、iとidは違っています.したがって、ツリー配列の特性を利用して、逆数の個数を簡単に算出することができます.
まだ分からないなら例を挙げます.(4個の数を入力)
入力:9-1 18 5
出力3.
入力したら対応する構造体がこうなります.
val:9-1 18
id: 1 2 3 4
順番を決めてからになります.
val: -1 5 9 18
id: 2 4 1 3
2 4 1 3の逆序数も3です.
その後、樹状配列の特性を利用すれば問題を解決できます.
数字が重複している可能性があるので、追加操作は単に1ではなく、+++である.
#include
#include
#include
#include
#include
#include
HU 4000 Fuit Ninja(樹状配列)
n個の数を与えて、すべてのiを求める.
問題は最後の数を二番目に大きくすることです.i番目の数字aを入力すると、私たちが使っている樹状配列はsum(a-1)であり、sum(a-1)はaという位置を表しています.i-1個の数のうち、sum(a-1)個の数はaより小さいので、後の(i+1,n)のシーケンスの中で、R=(n-a)-(i-1-sum(a-1)の数よりも大きいです.(a-1)個の数がaより大きいとR=(n-a)-(i-1-sum(a-1)は後の数がaより大きいということを示します.そして、aは3つの数の中の最小値として考えて、それらを組み合わせると、C(R,2)つまりR*(R-1)があるのではないかと思います.2、後のシーケンスは固定されているので、順序付けの概念はなく、つまり、元のシーケンスは5、4の場合を考える必要はありません.4、5の場合は固定されていますので、後のシーケンスはRから2つを選択すればいいです.そして、C(R、2)はすべてのa+2つの大きさを表します.(つまり、小・中・大・中は全部中に含まれています)ので、私達が要求するのは小・中です.だから、aごとに小・中・大の場合を差し引いて、小・中・大=sum(a−1)*Rとなります.だから、最後の答えは(1,n)の全部の数に対して、SUM(C(R,2)-sum(a−1)*Rとなります.
#include
#include
#include
#include
#include
#include
POJ 2481 Cows(ツリー配列)
先に意味を書きます.つまり、いくつかの線分を入力します.この線分は最大何本かの線分If Si(=Sj and Ej<=Ei and Ei-Si>Ej-Sjが含まれていますか?
このように問題は簡単です.私達は後ノードによって大きいから小さい順に並べられます.もし後ノードが等しいなら、前ノードは小さいから大きい順に並べられます.このように順序を並べたら、前ノードより前のノードの数だけ探していけばいいです.
#include
#include
#include
#include
#include
#include
POJ 1990 MooFest(樹状配列)
2頭の牛i、jが交流する時、交流の最小の音はmax{v[i]、v[j]*彼らの間の距離です.今はn頭の牛がいます.彼らの間で交流するには少なくとも必要な音量と.
暴力を使うと必ず時間がかかりますので、木の形の配列を使ってもいいです.まず牛を音の値にして、小さい時から大きな順に並べます.そして二つの配列を宣言して、現在入力されている牛の前の位置がそれより小さい牛の個数を記録します.これらの牛の位置と位置を記録します.現在の牛と他の牛の違いをどうやって求めますか?これです.二つの部分に分けて計算します.一つは現在の牛より小さい牛と位置が現在の牛より大きい牛です.位置が小さい牛は計算がいいです.現在の牛の聴力値は現在の牛より小さい牛の位置差を乗じます.大きな牛は計算がちょっと面倒です.現在入力されているすべての牛の位置と、位置が小さい牛の位置と、位置を減らします.それより大きい牛の位置と彼の聴力値を乗じていると、この牛は他の牛と違ってすべての価値があります.聴力順に並べられているので、今の牛の聴力値は一番大きいです.直接乗ればいいです.
#include
#include
#include
#include
#include
POJ 3264 Balanced Lineup(RMQ)
この問題は線分樹で守ることができますが、ここはRMQを使うともっと便利です.
#include
#include
#include
#include
#include