codeforces #502 C ~The Phone Number~
背景が面白い問題だったのでつい投稿。嘘を書いていたら教えてください。
問題要約
長さの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 ,then we can achieve .
なんでや。
ということで詳しく調べてみた。
まず,いくつか準備。
定義(最小被覆パス)
を閉路をもたない有向グラフとする。の最小被覆パスとは,パスの集合の組であって,これらがの分割になっているようなもの(すべての頂点に対して,あるがただ1つあって,)のうち,が最小のものである。
定義(反鎖)
を閉路をもたない有向グラフとする。の反鎖(antichain)とは,の部分集合であって,の任意の2要素の間にパスがないもののことである。
本来この語は半順序集合に定義されるもののようだが,閉路をもたない有向グラフは半順序集合とみなせる(と思う)ので,ここではグラフで定義をしても差し支えない。
Dilworthの定理とは以下のようなものらしい。
定理(Dilworth)
閉路をもたない有向グラフにおける最小被覆パスの大きさ(上の定義でいうところの)と,の最大の反鎖の大きさは等しい。
証明は(https://en.wikipedia.org/wiki/Dilworth%27s_theorem)を参照。こちらは半順序集合の言葉で話を進めているので注意。
LISとLDSに話を戻そう。長さのpermutationをとする。このとき,頂点集合をとして,グラフを作る。について,かつのときにからに辺を張る。このグラフをとすると,LISの長さはの最長のパスの長さであり,LDSの長さは最大の反鎖の大きさになる。これが肝である。
こんな感じ。
LISの長さがのとき,が最小であることを示そう。Dilworthの定理より,はの最小被覆パスの大きさに等しい。ここで,LISの長さがであることから,最小被覆パスを構成するパスたちのそれぞれの大きさは高々である。すると,,つまりが成り立つ。この下界は達成できる。実際,がそうなっている。
本番中に証明までして通した人どれくらいいるんだろう。
参考:
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