SMAWK

totally monotoneな暗黙行列について、各行の最小要素の列を求めます。

一般形

let argmin =
  smawk[T](
    rowCount,
    columnCount,
    value,
  )

引数

行列全体を配列として保持する必要はありません。

前提条件

前提条件を満たさない行列に対する結果は保証しません。負の次元や、 行があるのに列が0の場合はValueErrorを送出します。

返り値

返り値は長さrowCountのseq[int]です。

argmin[row]

は、その行の最小値を与える列番号です。最小値が複数ある場合は、 最も左の列を返します。

rowCount == 0の場合は空列を返し、valueを呼びません。

具体例

import atcoder/extra/dp/smawk

let centerTimesTwo =
  @[0, 1, 3, 6]

let value =
  proc(
      row,
      column: int,
  ): int =
    let difference =
      2 * column - centerTimesTwo[row]

    difference * difference

let argmin =
  smawk[int](
    centerTimesTwo.len,
    5,
    value,
  )

doAssert argmin == @[0, 0, 1, 3]

関連API

valueの呼び出し回数を行数と列数の和に抑えたいtotally monotone行列では smawkを使用します。

計算量

valueの評価をO(1)とすると、