Codeforces Round 1030

A. Equal Subsequences

0000011111 タイプのものだと両方 $0$ 個です.

B. Make It Permutation

手前 $k$ 個と後ろ $n-k$ 個を両方 reverse する,というタイプの操作を各 $k$ について行います.これは必ず「全体を reverse したものの cyclic shift」になる(有名?ARC153B など)ことから条件を満たします.

C. Make It Beautiful

「popcnt を $1$ 大きくするためのコスト」を考えて,小さいコストから貪欲にとっていきます.

$1$ 大きくするには,$0$ であるような lowest bit の位置が $1$ になるまで加算します.同じ $a_i$ に対するコストが昇順になることも分かるので,全要素の全コストをソートして昇順にとる貪欲が実際に実行可能です.

D2. Red Light, Green Light (Hard version)

「あるマスで赤色である時刻にこっちの方向に進む」という $2N$ 状態を考えます.これに「ゴールできた」という状態を合わせた $2N+1$ 状態を考えます.

これで,functional graph を作ります(例えばゴールからはゴールに辺を張る).クエリに答えるには,最初に引っかかるイベントがどれかを求めて,そこから functional graph に従って進んだときにゴールに行けるかを判定です.functional graph 上の何かをしてもよいし,単にゴールと同じ連結成分かどうかだけでもよいです.

この計算を実行するために,「あるマスからある方向に進んだときに最初に出会うイベントを取得」のようなものを実装します.実装によってはクエリの最初と,赤色マスからの移動で少し呼び出し方などを工夫する必要が出てくるかもしれません.

E. Grid Coloring

基本的に中央からはじめて bounding box を拡張していく感じというのは想像がつくと思います.

あとはそれっぽいものを考えて気合実装.チェックも実装する.

グリッドとペナルティの途中経過をデバッグ出力しながら進めるとやりやすいと思います.

F. Shifts and Swaps

むずかしかった.

とりあえずすべての要素が区別可能で,各要素を $B$ のどの要素に対応させるかを確定させてあることを考えます.すると判定は比較的簡単で,

  • 任意の $x$ について,「値が $x$ の要素,値が $x+1$ の要素」だけを A, B それぞれから取り出した列が,cyclic shift の関係である.

となります.要素が区別可能としていたので,「取り出した列」は $2$ 値ではなくて,$x, x+1$ の総数だけ要素があります.

必要性は言われれば簡単.十分性は,$x$ について昇順に,「値が $x$ 以下の要素だけを取り出したもの」が対応させられることを示していきます.最大値が $x+1$ であるような列では,$x+1$ はどの $x$ にはさまれているかという情報だけを保って自由に動かせることに注意します.

よって,要素をどう対応させられるかを観察することになります.

$\dp[x][i]$ を,A における最初の $x$ を B における $i$ 番目の要素を対応させられるか?という bool 列として,dp を更新していきます.

dp の更新のために必要となるのは,ある列の cyclic shift が別の列と一致するかの判定だけで,Z algorithm などの適当な文字列アルゴリズムで行えます.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました