勝てない相手キャラがいないような最短の区間を尺取り法で求める。つまり、キャラが勝てるキャラの数、として各区間について正しいを求めて、になるような最短の区間を探せばよい。
具体的には、最初に
キャラが勝てないキャラの集合(同キャラ含む)
と言うデータを作っておく。区間を伸ばすときは全体に1を足してから各についてとし、区間を縮めるときには全体から1を引いてから各についてとする。にセグメント木等を使えば簡単。
ようやく尺取り法の間違えにくい書き方にたどり着いたのでメモ。
ok
関数とng
関数で相互再帰する。- 常に半開区間を扱う。
(ok l r)
はが条件を満たすときに呼び出され、(ng l r)
はが条件を満たさないときに呼ばれる。r
はこれから追加される位置であり、l
はこれから除去される位置である。 (ok l r value)
のように区間に関する値を受け渡す場合、value
は常に区間に対応する値になるようにする。- 最適値を求める場合は
ok
関数の冒頭で更新する。