--- tags: 競プロ --- # [Monge まとめ①] Monge 性とは? ## まえがき LARSCH の読んだので解説記事を書こうと思ったが、説明が難しくてなかなか書けない… Monge を理解していきたいので Monge の記事を書きます。 完全に理解しているわけではないのでご了承ください。 ## Monge の読み方 もんげ〜 と読みます。嘘です。 ## Monge の定義 実数からなる $N \times M$ 行列について考えます。 :::info $N \times M$ 行列 $A$ が Monge であるとは、以下の条件が成り立つことをいう。 - $1 ≤ i_1 < i_2 ≤ N$ および $1 ≤ j_1 < j_2 ≤ M$ を満たすすべての整数の組 $(i_1, i_2, j_1, j_2)$ について、$A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ である。 ::: [ABC224-B Mongeness](https://atcoder.jp/contests/abc224/tasks/abc224_b) 上三角 / 下三角 バージョンもよくでてきますね。 ### 上三角バージョン :::info $N \times N$ 行列 $A$ は 上三角 ( $i > j$ ならば無効値) であるものとする。このとき、上の条件は以下のように言い換えられる。 - $1 ≤ i_1 < i_2 ≤ j_1 < j_2 ≤ N$ を満たすすべての整数の組 $(i_1, i_2, j_1, j_2)$ について、$A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ である。 ::: これは、無効値の部分を Monge になるように適当な値で埋め、さらに十分大きな定数 $\textit{INF}$ を用いて、無効値だった部分 $(i > j)$ の各要素に $\textit{INF} \times (i - j)$ を加算すれば、通常の Monge として解釈できます。 つまり、右上や左下の一部分を無効値にしても Monge 性には問題がないということです。 (右下や左上だとうまくいかないことに注意しましょう。) ## 何につかえるの? - $N \times M$ 行列 $A$ が Monge であるとき、各行の最小値を $O(N + M)$ で求められます。 - $N$ 頂点のグラフがあり、頂点 $i$ から頂点 $j$ へ $(i < j)$ に移動するコストが $A_{i, j}$ であるとします。$A$ が Monge であるとき、単一始点最短路が $O(N)$ で求められます。 - [辺をちょうど $d$ 回通る場合の $s-t$ 最短路が $O(N \log A_\max)$ で求められます。](https://noshi91.github.io/algorithm-encyclopedia/d-edge-shortest-path-monge) - $A$ が Monge かつ単調 (区間が長いほど大きい) であるとき、区間 DP $\text{dp}[i][j] = \displaystyle\min_{i<k<j}\{\text{dp}[i][k] + \text{dp}[k][j]\} + A_{i,j}$ が $O(N^2)$ で計算できます。 - ほかいろいろ ### Monge のおきもち 私なりの理解です。 ちょっと式変形してみましょう。 $$ \begin{aligned} A_{i_1,j_1} + A_{i_2, j_2} &≤ A_{i_1,j_2} + A_{i_2, j_1}\\ A_{i_2, j_2} - A_{i_2, j_1} &≤ A_{i_1,j_2} - A_{i_1,j_1}\\ \end{aligned} $$ ここで、$A_{i_2, j_2} - A_{i_2, j_1}$ とは、「区間 $[i_2, j_1]$ の左端を固定し、右端を $j_1 → j_2$ と広げたときのコストの増分」と解釈できます。 $A_{i_1, j_2} - A_{i_1, j_1}$ も同様に、「区間 $[i_1, j_1]$ の左端を固定し、右端を $j_1 → j_2$ と広げたときのコストの増分」と解釈できます。 したがってこの式は、**「右端を $j_1 → j_2$ と広げたときのコストの増分」は、元々の区間 $[i, j_1]$ が長いほど大きい** ことを表しています。 つまり、こうです。 $$ A_{i,j_2} - A_{i,j_1} ≤ A_{i-1,j_2} - A_{i-1,j_1} ≤ A_{i-2,j_2} - A_{i-2,j_1} ≤ A_{i-3,j_2} - A_{i-3,j_1} ≤ \cdots $$ --- 左端を広げる場合も同様です。 $$ \begin{aligned} A_{i_1,j_1} + A_{i_2, j_2} &≤ A_{i_1,j_2} + A_{i_2, j_1}\\ A_{i_1, j_1} - A_{i_2, j_1} &≤ A_{i_1, j_2} - A_{i_2, j_2}\\ \end{aligned} $$ とすれば、**「左端を $i_2 → i_1$ と広げたときのコストの増分」は、元々の区間 $[i_2, j]$ が長いほど大きい** ことも表しています。 つまり、こうです。 $$ A_{i_1, j} - A_{i_2, j} ≤ A_{i_1, j + 1} - A_{i_2, j + 1} ≤ A_{i_1, j + 2} - A_{i_2, j + 2} ≤ A_{i_1, j + 3} - A_{i_2, j + 3} $$ ## 同値な条件 これをふまえると、以下の同値な条件がわかります。 :::info $N \times M$ 行列 $A$ が Monge であるとは、以下の条件が成り立つことをいう。 - $1 ≤ i < i + 1 ≤ N$ および $1 ≤ j < j + 1 ≤ M$ を満たすすべての整数の組 $(i, j)$ について、$A_{i,j} + A_{i + 1, j + 1} ≤ A_{i + 1,j} + A_{i, j + 1}$ である。 ::: :::warning **証明** $A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ の方を (A) 、$A_{i,j} + A_{i + 1, j + 1} ≤ A_{i + 1,j} + A_{i, j + 1}$ の方を (B) とします。 (A)$\implies$(B) は明らかなので、(B)$\implies$(A) を示せばよいです。 (B) を $A_{i + 1, j + 1} - A_{i, j + 1} ≤ A_{i + 1, j} - A_{i, j}$ と変形すると、 $$ A_{i + 1, j_2} - A_{i, j_2} ≤A_{i + 1, j_2 - 1} - A_{i, j_2 - 1} ≤ \dots ≤ A_{i + 1, j_1 + 1} - A_{i, j_1 + 1} ≤ A_{i + 1, j_1} - A_{i, j_1} $$ より $A_{i + 1, j_2} + A_{i, j_1} ≤ A_{i + 1, j_1} + A_{i, j_2}$ です。 また、これを $A_{i + 1, j_2} - A_{i + 1, j_1} ≤ A_{i, j_2} - A_{i, j_1}$ と変形すると、 $$ A_{i_2, j_2} - A_{i_2, j_1} ≤ A_{i_2 - 1, j_2} - A_{i_2 - 1, j_1} ≤ \dots ≤ A_{i_1 + 1, j_2} - A_{i_1 + 1, j_1} ≤ A_{i_1, j_2} - A_{i_1, j_1} $$ より $A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ が示せました。 ::: ## Monge 行列の性質 #### 転置しても Monge 定義の $i, j$ が対称な形なので、$i, j$ を入れ替えれば転置しても Monge であることがわかります。 #### 部分行列も Monge Monge 行列 $A$ から、任意に行を $0$ 本以上削除し、任意に列を $0$ 本以上削除した行列 $A'$ を考えると、これも Monge です。 定義が、$A$ から任意の $2$ 行 $2$ 列を取り出すと $A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ である という形なので、$A'$ から取り出しても成り立ちます。 #### Monge ならば totally monotone まずは monotone から定義していきましょう。 ### monotone :::info 行ベクトル $v$ に対して、$\operatorname{argmin}(v)$ を $\min(v) = v_j$ なる $j$ と定義する。ただし、同じ値が複数ある場合は適切に tie-break し、同じ値が存在しないようにする。これにより $\min(v) = v_j$ なる $j$ は一意に定まる。 $N \times M$ 行列 $A$ が monotone であるとは、以下の条件が成り立つことをいう。 - $\operatorname{argmin}(A_1) ≤ \operatorname{argmin}(A_2) ≤ \dots ≤ \operatorname{argmin}(A_N)$ ::: ### totally monotone :::info $N \times M$ 行列 $A$ が totally monotone であるとは、以下の条件が成り立つことをいう。 - $A$ の任意の部分行列 ($A$ から任意に行を $0$ 本以上削除し、任意に列を $0$ 本以上削除した行列) は monotone である。 ::: 部分行列にはいろいろな定義があるみたいなので、明示しておきます。 :::info 行列 $A'$ が行列 $A$ の部分行列であるとは、以下の条件が成り立つことをいう。 - $A$ から行を $0$ 本以上削除し、列を $0$ 本以上削除した結果 $A'$ を作ることができる。 ::: #### 同値な条件 行を削除しても monotone の条件が緩くなるだけなので、行の削除は考えなくて良いです。 ある列番号の集合 $J \subset \{1, 2, …, M\}$ が存在して、$A$ から $J$ 以外の列を削除した行列 $A'$ が monotone でないと仮定します。 すなわち、ある $i$ が存在して $\operatorname{argmin}(A'_i) > \operatorname{argmin}(A'_{i+1})$ ということです。 このとき、$j_1 = \operatorname{argmin}(A'_{i+1})$ と $j_2 = \operatorname{argmin}(A'_i)$ の $2$ 列のみを取ってきても、$A'_{i,j_1} > A'_{i,j_2}$ かつ $A'_{i+1,j_1} < A'_{i+1,j_2}$ なので monotone になっていません。 したがって、以下の同値な条件がわかります。 :::info $N \times M$ 行列 $A$ が totally monotone であるとは、以下の条件が成り立つことをいう。 - $1 ≤ i < i + 1 ≤ N$ および $1 ≤ j_1 < j_2 ≤ M$ を満たすすべての整数の組 $(i, j_1, j_2)$ について、行 $i, i + 1$ と列 $j_1, j_2$ のみからなる部分行列が monotone $(A_{i,j_1} > A_{i,j_2} \implies A_{i+1,j_1} > A_{i+1,j_2})$ である。 ::: #### つまり…? $A_{i, j_1}$ と $A_{i, j_2}$ を比較し、 $A_{i, j_1} > A_{i, j_2}$ であった場合 : $$ A_{i, j_1} > A_{i, j_2} \implies A_{i+1, j_1} > A_{i+1, j_2} \implies A_{i+2, j_1} > A_{i+2, j_2} \implies \cdots $$ $A_{i, j_1} < A_{i, j_2}$ であった場合 : $$ A_{i, j_1} < A_{i, j_2} \implies A_{i-1, j_1} < A_{i-1, j_2} \implies A_{i-2, j_1} < A_{i-2, j_2} \implies \cdots $$ と、連鎖的に大小が定まります。 #### Monge ならば totally monotone $A$ が $2 \times 2$ Monge 行列のとき、Monge $\implies$ monotone を示します。 :::warning Monge なので $A_{2,2} - A_{2,1} ≤ A_{1,2} - A_{1,1}$ です。このとき $\text{argmin}$ がどうなるかを見ると、 | 条件 | $\operatorname{argmin}(A_1)$ | $\operatorname{argmin}(A_2)$ | |:-------------------------------------------:|:----------------------------:|:----------------------------:| | $0 < A_{2,2} - A_{2,1} ≤ A_{1,2} - A_{1,1}$ | $1$ | $1$ | | $A_{2,2} - A_{2,1} < 0 < A_{1,2} - A_{1,1}$ | $1$ | $2$ | | $A_{2,2} - A_{2,1} ≤ A_{1,2} - A_{1,1} < 0$ | $2$ | $2$ | なので $A$ は monotone です。 ::: $A$ が一般の行列のとき、 Monge $\implies$ 任意の $2 \times 2$ 部分行列が Monge $\implies$ 任意の $2 \times 2$ 部分行列が monotone $\implies$ totally monotone なので、Monge ならば totally monotone です。 #### 行の中に同じ値が存在する場合 $A$ の各要素に列番号を付加 : $A_{i,j} \mapsto (A_{i,j}, j)$ をして、これの辞書順で大小を比較するようにすると、行の中で tie-break ができます。 $A$ が Monge ならば、 $$ \begin{aligned} &&A_{i_1,j_1} + A_{i_2, j_2} &≤ A_{i_1,j_2} + A_{i_2, j_1}\\ \implies&&(A_{i_1,j_1} + A_{i_2, j_2}\,,\,j_1 + j_2) &≤ (A_{i_1,j_2} + A_{i_2, j_1}\,,\,j_1 + j_2)\\ \implies&&(A_{i_1,j_1}, j_1) + (A_{i_2, j_2}, j_2) &≤ (A_{i_1,j_2}, j_2) + (A_{i_2, j_1}, j_1)\\ \end{aligned} $$ より列番号を付加した状態でも Monge で、totally monotone であることがわかります。 totally monotone だけど Monge でないという問題を見たことがないので、totally monotone と Monge は同じものだと思ってしまって良いです。(本当に?) #### 1 つの 行 / 列 に値を加算しても Monge Monge の条件式 $A_{i_1,j_1} + A_{i_2, j_2} ≤ A_{i_1,j_2} + A_{i_2, j_1}$ において、行 $i_1$ に定数 $c$ を加算しても、 $$ (A_{i_1,j_1} + c) + A_{i_2, j_2} ≤ (A_{i_1,j_2} + c) + A_{i_2, j_1} $$ 両辺に $c$ が足されるだけなので変わりません。同様に、列 $j_1$ に定数 $c$ を加算しても、 $$ (A_{i_1,j_1} + c) + A_{i_2, j_2} ≤ A_{i_1,j_2} + (A_{i_2, j_1} + c) $$ 両辺に $c$ が足されるだけなので変わりません。 #### 合成しても Monge Monge 行列 $A \in \mathbb R^{N \times M}, B \in \mathbb R^{M \times K}$ に対し、$C_{i,j} = \displaystyle\min_k\{A_{i,k} + B_{k,j}\}$ で定義される行列 $C$ は Monge です。 :::warning 任意の $i_1 < i_2,\ j_1 < j_2$ に対して $$ C_{i_1, j_1} + C_{i_2, j_2} ≤ C_{i_1, j_2} + C_{i_2, j_1} $$ を示したいです。これは、任意の $k_1, k_2$ に対しある $l_1, l_2$ が存在して、 $$ (A_{i_1,l_1} + B_{l_1,j_1}) + (A_{i_2,l_2} + B_{l_2,j_2}) ≤ (A_{i_1,k_1} + B_{k_1,j_2}) + (A_{i_2,k_2} + B_{k_2,j_1}) $$ と同値です。 $k_1 ≤ k_2$ のとき、Monge 性より $B_{k_1,j_1} + B_{k_2,j_2} ≤ B_{k_1,j_2} + B_{k_2,j_1}$ なので、$(l_1, l_2) = (k_1, k_2)$ を選ぶと不等式が成立します。 $k_1 ≥ k_2$ のとき、Monge 性より $A_{i_1,k_2} + A_{i_2,k_1} ≤ A_{i_1,k_1} + A_{i_2,k_2}$ なので、$(l_1, l_2) = (k_2, k_1)$ を選ぶと不等式が成立します。 ::: ## Monge 行列の例 - [下に凸](https://ja.wikipedia.org/wiki/%E5%87%B8%E9%96%A2%E6%95%B0) な関数 $f : \mathbb Z \to \mathbb R$ に対し、$A_{i,j} = f(j - i)$ で定義される行列 $A$ は Monge です。 :::warning $$ A_{i,j} + A_{i+1,j+1} - A_{i,j+1} - A_{i+1,j} = 2f(j - i) - f(j - i - 1) - f(j - i + 1) $$ $f$ は下に凸なので $\displaystyle f(j - i) ≤ \frac{f(j - i - 1) + f(j - i + 1)}{2}$ であり、 $$ A_{i,j} + A_{i+1,j+1} - A_{i,j+1} - A_{i+1,j} ≤ 0\\ A_{i,j} + A_{i+1,j+1} ≤ A_{i,j+1} + A_{i+1,j}\\ $$ より Monge です。 ::: - [$\displaystyle A_{i,j} = (j - i)^2 + \sum_{k = i}^{j - 1} a_k$](https://yukicoder.me/problems/no/913) :::warning $a$ の累積和を $\displaystyle s_i = \sum_{k=1}^{i-1}a_k$ とすると、$A_{i,j} = (j - i)^2 + s_j - s_i$ です。 $s_j$ と $-s_i$ は 行 / 列 に加算しているので関係なく、$(j-i)^2$ は $j - i$ の凸関数なので、Monge です。 ::: - Monge 行列 $A$ と広義単調増加関数 $f:\mathbb N \to \mathbb N$ に対し、$B_{i,j} = A_{i,f(j)}$ で定義される行列 $B$ は Monge です。 :::warning $$ B_{i_1,j_1} + B_{i_2,j_2} = A_{i_1,f(j_1)} + A_{i_2,f(j_2)} ≤ A_{i_1,f(j_2)} + A_{i_2,f(j_1)} = B_{i_1,j_2} + B_{i_2,j_1} $$ より Monge です。 同様に $B_{i,j} = A_{f(i),j}$ でも Monge です。 ::: - $A_{i,j} = (a_i - b_j)^2$ ( $a, b$ は広義単調増加の整数列) :::warning - $A''_{i,j} = (i - j)^2$ は Monge です。 - $a$ は広義単調増加なので、$A'_{i,j} = (a_i - j)^2$ は Monge です。 - $b$ も広義単調増加なので、$A_{i,j} = (a_i - b_j)^2$ は Monge です。 - (実数列でも Monge になります。) ::: - Monge 行列 $A$ と実数 $c ≥ 0$ に対し、$B_{i,j} = cA_{i,j}$ で定義される行列 $B$ は Monge です。 - Monge 行列 $A,B$ に対し、$C_{i,j} = A_{i,j} + B_{i,j}$ で定義される行列 $C$ は Monge です。 - $A_{i,j} = (B_i\,\operatorname{AND}\,B_{i+1}\,\operatorname{AND}\,\cdots\,\operatorname{AND}\,B_{j-1})$ ($\text{AND}$ は bitwise AND 演算) :::warning $1$ つの bit で Monge であれば、bitwise AND はその線型結合なので Monge になります。 以下 $B_i \in \{0, 1\}$ とします。 $$ \begin{aligned} (A_{i+1,j}-A_{i+1,j+1}) - (A_{i,j}-A_{i,j+1}) &= A_{i+1,j}(1-B_j) - A_{i,j}(1-B_j)\\ &= (A_{i+1,j}-A_{i,j})(1-B_j)\\ &= A_{i+1,j}(1-B_i)(1-B_j)\\ &≥ 0\\ \end{aligned} $$ より Monge です。 こんな計算をしなくても、**「右端を $j_1 → j_2$ と広げたときのコストの減少分」は、元々の区間 $[i, j_1]$ が長いほど小さい** を確認すれば :ok: です。 ::: ### 参考文献 [Knuth-Yao speedup - 週刊 spaghetti_source - TopCoder部](https://topcoder-g-hatena-ne-jp.jag-icpc.org/spaghetti_source/20120915/1347668163.html)