codeforces #502 C ~The Phone Number~

背景が面白い問題だったのでつい投稿。嘘を書いていたら教えてください。
問題要約
長さnのpermutationのうち,最長増加部分列(LIS)の長さと最長減少部分列(LDS)の長さの和が最小になるものを1つ出力せよ。
https://codeforces.com/contest/1017/problem/C

本番はエスパーして解いたので,解説を見たところこう書いてあった。


You can use [Dilworth's theorem]https://en.wikipedia.org/wiki/Dilworth So assume we've already known that  LIS=L,then we can achieve  LDS=\lceil \frac{n}{L} \rceil.



なんでや。



ということで詳しく調べてみた。
まず,いくつか準備。
定義(最小被覆パス)
 G(V,E)を閉路をもたない有向グラフとする。Gの最小被覆パスとは,パスの集合の組P_1,\dots P_kであって,これらがVの分割になっているようなもの(すべての頂点v\in Vに対して,あるP_iがただ1つあって,v\in P_i)のうち,kが最小のものである。

定義(反鎖)
G(V,E)を閉路をもたない有向グラフとする。Gの反鎖(antichain)とは,Vの部分集合Pであって,Pの任意の2要素の間にパスがないもののことである。
本来この語は半順序集合に定義されるもののようだが,閉路をもたない有向グラフは半順序集合とみなせる(と思う)ので,ここではグラフで定義をしても差し支えない。

Dilworthの定理とは以下のようなものらしい。
定理(Dilworth)
閉路をもたない有向グラフG(V,E)における最小被覆パスの大きさ(上の定義でいうところのk)と,Gの最大の反鎖の大きさは等しい。
証明は(https://en.wikipedia.org/wiki/Dilworth%27s_theorem)を参照。こちらは半順序集合の言葉で話を進めているので注意。

LISとLDSに話を戻そう。長さnのpermutationをp_1,p_2,\dots,p_nとする。このとき,頂点集合を\{p_1,p_2,\dots,p_n\}として,グラフを作る。p_i,p_j (1\leq i.j\leq n)について,p_i\lt p_jかつi\lt jのときにp_iからp_jに辺を張る。このグラフをG(V,E)とすると,LISの長さLGの最長のパスの長さであり,LDSの長さKは最大の反鎖の大きさになる。これが肝である。
こんな感じ。
f:id:sigma1113:20180809202306j:plain

LISの長さがLのとき,K=\lceil \frac{n}{L} \rceilが最小であることを示そう。Dilworthの定理より,KG(V,E)の最小被覆パスの大きさに等しい。ここで,LISの長さがLであることから,最小被覆パスを構成するパスたちP_1,P_2,\dots,P_Kのそれぞれの大きさは高々Lである。すると,KL\geq n,つまりK\geq \lceil \frac{n}{L} \rceilが成り立つ。この下界は達成できる。実際,L(K-1)+1,L(K-1)+2,\dots,n,L(K-2)+1,L(K-2)+2,\dots,L(K-1),\dots\dots,L+1,L+2,\dots,2L,1,2,\dots,Lがそうなっている。

本番中に証明までして通した人どれくらいいるんだろう。

参考:
codeforces https://codeforces.com/contest/1017/problem/C
https://codeforces.com/blog/entry/61081

Dilworth's theorem https://en.wikipedia.org/wiki/Dilworth%27s_theorem

Erdős–Szekeres theorem https://en.wikipedia.org/wiki/Erd%C5%91s%E2%80%93Szekeres_theorem

Divisor https://www.slideshare.net/oupc/divisor

順序集合 https://ja.wikipedia.org/wiki/%E9%A0%86%E5%BA%8F%E9%9B%86%E5%90%88