# 数列 ## ソートをしても一般性を失わないならソートする ソートされていると扱うのが簡単になる例は多い ## 条件を満たすi,jのペアの数 値を辞書で管理しておくと判定が簡単になる場合が多い ## 条件を満たすi,j,kの3値の数 どれかの値を固定すると見通しがよくなる。 最初に全ての値をdataRに入れておき、jをシフトすると共にdataLにjだった値を入れていけば、jを中心とした時の左右の値を管理できる。 管理の仕方としては存在確認をしたいなら辞書、ある範囲の数を数えたいなら、BITなどで持たせる。 - 例、 jの値を中心として、より小さい左の値、より大きい右の値の数をカウントしたいならBIT管理が適する ## 区間和の最大 初期値を0として頭から和にして、値が負になったら0にリセットし、次の数からスタートとする。 ある地点で負になった場合、その値を次からに持ち越す必要はなく、次の値から始めた方が良い。 # グラフ ## ダイクストラ法 - 単一始点、全終点を求める。 - 負のサイクルがあってはいけない。負の辺があること自身は許容される - 各点について更新した1つ前の点を覚えておくことで始点からのパスを求めることが可能 - 全点についてこのパスを復元すると、辺数は$n-1$の全域木となる(最小全域木とは限らない) ## ハミルトン # 閉路を含むグラフ - 強連結成分分解をするとDAGになるので、木にできる # 木 ## 葉から辿る・根から辿るにはトポロジカルソートを使っても良い - 根からトポロジカルソートをすると、順に辿れば根から辿れる。逆に辿れば葉から辿れる。DFSして良いが、なにも考えずにライブラリで配列の形で計算を流せる。 # データ構造 ## SparseTable  - 更新不可、区間クエリO(1) - 事前計算 O(logN) クエリO(1)