https://en.wikipedia.org/wiki/Longest_increasing_subsequence https://ikatakos.com/pot/programming_algorithm/dynamic_programming/longest_common_subsequence

最長増加部分列

ある数列 A = {a1, a2, ... an} があるとき B = {ai, ai+1, ...ak } (1 <= i < k <= n) を部分列と呼ぶ。 そして ai < ai+1 を満たすときBは増加部分列と呼ぶ。 増加部分列のうち最長のものを見つけたい。

cross-free matching

https://atcoder.jp/contests/arc126/tasks/arc126_b https://atcoder.jp/contests/arc126/editorial/2626

線分がM個ある

(a1, 0), (b1, 1) (ai, 0), (bi, 1) (am, 0), (bm, 1)

a1 < ai < am と仮定する

このとき、線分が交差しないように選択するということは bi < bi+1 を満たすということ これは LIS に帰着できる

a1 <= ai <= am と仮定する

LIS に帰着するため2つの線分の関係を下記のように定義する。

(ai, 0), (bi, 1) < (aj, 0), (bj, 1) は

ai < aj である そうでないならば ai = aj かつ bi > bj である

つまり (10, 0), (11, 1) < (10, 0), (10, 1)

である。

この条件のもとで線分が < 関係を満たすように並べ替えれば 線分交差は LIS に帰着できる…らしい

LIS の長さ計算

動的計画法を用いる。 dp[i][x] は i 項目まで計算対象としたとき、末尾が x である場合のLISの最大長とする。

セグメント木

https://algo-logic.info/segment-tree/