2022年8月8日月曜日

Codeforces Round #812 (Div. 2)

 Dまで四完。

コンテスト後のツイート

E. Cross Swapping

 解説AC。面白い問題だったが、最初の一手にさえ気付いてなかったので、何も言えない。

 まず、

・A[i][j]はA[j][i]としか入れ替わらない

 と気付くのが重要。(コンテスト中散々実験したのに気付かなかったのはひどかった。何故……)

 だが、A[i][j]とA[j][i]を入れ替えたいとき、iとjのどちらを用いてswapすれば良いか分からない。また、入れ替えたくない時、iとj両方使わないのか、もしくは使うのかが分からない。

 これは、グラフの問題になる。

 左上から貪欲に、A[i][j]とA[j][i]の大小に従って、iとjでswapする/しないが一致する場合は0の、一致しない場合は1が書かれた辺を張っていく。そして、iとjがループしてしまいそうなときは、辺を張らないようにする。なぜなら、ループができたら結果が決まらなくなるため。左上から貪欲に決めているので、前に決めたことを優先した方が良い。

 こうして決めた後、木それぞれについてswapする、しないを割り振っていけばOK。

0 件のコメント:

コメントを投稿