問題. Sixth Sense
2つの整数列 が与えられる.
番目の要素が
よりも大きくなるような要素が最も多くなるように
を並び替えよ.そのような並び方が複数ある場合は辞書式順序で最も大きいものを求めよ.
制約: ,
解法
辞書式順序の制約がなければ,二部グラフ の部集合
をそれぞれ列
として,各辺
を
として定義したものの上での最大マッチング問題と等しくなります.また,
は Bipartite chain graph なので,
の最大マッチングは
と
をそれぞれ昇順に整列した列
によって構成される二部グラフ上で,
を昇順に貪欲的にマッチングすることによって
時間で求めることができます.
最大マッチングを満たす列の中で辞書式順序で最大のものを見つけることを考えます. に対応する
の要素は二分探索で求めることができます.まだ選ばれていない
の要素を昇順に並べたものを
として,
よりも大きい要素で最も左にあるものを
とします.
まず, から
を取り除いた列と
の最大マッチングのサイズを求めます.これが全体の最大マッチングのサイズと等しければ
から選ばれる要素は
よりも大きいことが分かります.したがって,
が
に対応させる候補となります.この候補の列は最大マッチングを保つかどうかで単調性が成立つので,最大マッチングを保つものの中で最大の要素を二分探索で求めることができます.次に,次に,
に対応させる候補が
の場合を考えます.このときも最大マッチングを保つかどうかで単調性が成立つので二分探索で求めることができます.したがって,各
に対して
回の判定で候補となるもを見つけることができ,各判定は
時間で求めることができるので全体で
時間で求めることができます.
計算時間:
まとめ
初め問題文を勘違いしてた(英語ムズカシイ).
2018年は解けなかったけど2019年になった途端に解けた.
辞書式順序制約が無い問題の類題として次があります.
POJ3646: The Dragon of Loowater