Codeforces Round 1027

スポンサーリンク

A. Square Year

$(0,x)$ の形で出力すればよいです.

B. Not Quite a Palindromic String

インデックスは $n$ 個のマッチングと,$0$ 個または $1$ 個の孤立点に分かれます.孤立点に入れる文字は $2$ 通り全探索します.

マッチングパートは,「$00, 11$ を入れて $1$ 点獲得」「$01$ を入れて $0$ 点獲得」という使い方がありそれぞれの回数は $k$ から決まります.後者の回数が決まっていることから前者で消費すべき $0$ の個数,$1$ の個数が決まり判定できます.

C. Need More Arrays

最適解であって,どの列の要素数も $1$ 以下になるものがあります.そうでない場合,末尾に追加されているものを削除しておいたことにすればよいです.

結局 $2$ 以上増えるようななるべく長い作ればよいです.

D. Come a Little Closer

操作は $1$ 点削除してどこかに挿入です.

削除するものを全探索します.削除時点での bounding box が計算できます.この面積が $n$ 以上であれば,bounding box の大きさを増やすことなく挿入できてその面積が解です.面積が $n-1$ ちょうどならばどちらかの軸方向を広げます.

E. Kirei Attacks the Estate

$v$ から根方向への交代和の min, max を各 $v$ について top down に計算します.

F. Small Operations

いったん有理数も経由してよいことにします.すると操作は可換になるので,「割り算を反復」「掛け算を反復」の順としてよくなります.

ゴールから遡れば,「$x$ から割り算を反復」「$y$ から割り算を反復」で同じものを作ればよいです.

それぞれの方向の「割る数」の総積は,互いに素としてよいです.両方が含む素数 $p$ をキャンセルすることを考えると証明可.すると結局,整数だけを経由する最適解がある($\gcd(x,y)$ になるまで割り算する)ことが分かります.

あとは各約数まで何回かかるかを適当に計算します.

G. Build an Array

以下,$2^a\cdot b$ のように書けば $b$ が奇数であることとします.

最大回数を計算します.その回数以下が全部達成できるというのが結論になりますが,その証明は最大化を理解できれば簡単なので省略します.

最終的な項は基本的に「左から挿入したもの」「右から挿入したもの」に分けて考えられます.ただし境界で端に両側から作ったものがあるかもしれません.

そこでまず列を prefix, suffix に分けて,それぞれで最大化することを考えます.

prefix に左から挿入することを考えます.

  • 右端の $2^a\cdot b$ は $2^a$ 回の挿入により作ることができてこれが最大です.(端の要素ということで逆側からの挿入も可能であることにしてもこの最大値は変わらない)
  • $a_i=2^ab, a_{i+1}=2^cd$ とします.
    • $b\neq d$ または $a<c$ ならば $a_i$ を $2^a$ 回の挿入で作れてそれが最大です.
    • $b=d$ かつ $b>d$ のとき.$a_{i+1}$ が完成した後で最初に挿入する要素は $a_{i+1}$ より大きくなければならないです.そのあとは $b$ を繰り返し挿入していくことで最大化できます.操作回数は $2^a-2^{c+1}+1$ です.

prefix, suffix の境界を全探索することで,最大操作回数を計算します.

独立にやって境界のところで操作が矛盾しないかについては,大きい方を先に完成させるようにすれば大丈夫です.

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