数列

ソートをしても一般性を失わないならソートする

ソートされていると扱うのが簡単になる例は多い

条件を満たす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)