Codeforces Round #531 (Div. 3)F. Elongated Matrix
問題概要
の行列が与えられる. この行列について, 行を自由に入れ替える. この結果できた行列を としたとき, 数列 を として定める.
このとき, ある に対して, 全ての について が成り立つとき, は良い数列であるという.
与えられた行列に対し, 良い数列が存在する最大の を求めよ.
制約
解法
見るからに二分探索です. 解となる を決め打ちして, 良い数列が構築できるか判定しましょう.
番目の行の次に 番目の行が来れるかどうかは, ならば来れると判定できます. これは, 各行を頂点とし, 条件を満たすとき の辺を張ることにすれば, 全ての頂点をめぐって最初の頂点に帰ってこれるか?という判定問題に帰着することができます.
そこで, 始点を全探索し, TSP のように bitDP をすれば, あらかじめグラフを構築しておけば で良い数列を作れるかどうかを判定できます.
この上で二分探索の分の が乗ってくるので計算時間的には怪しいですが, C++ を信じて投げましょう.