りにゅうしょく

競技プログラミング 日常

Codeforces Round #668 (Div. 2) 出たよ~~~~

約2か月半ぶりのこどふぉ、Div.2に参加しました。結果は2完(A,B)で緑落ちです。超絶自業自得……。Dまでは他の人に教えてもらったのでブログに残そうと思います。
コンテストURL:https://codeforces.com/contest/1405

A. Permutation Forgery

問題概要

1Nまでの整数で、要素の重複なく構成された長さNの数列に対応して、以下のN-1の長さの数列F(p)を作ります。
F(p)=sort(p_1+p_2,p_2+p_3,…,p_{n−1}+p_n)
F(p)が等しく、かつP_i \neq P'_iである長さNの数列をひとつ出力してください。

考え・反省

F(p)が等しくなるためには、ペアになる要素が元の数列と同じである必要があります。たとえばN=3だったら1個目+2個目、2個目+3個目がペアになって長さ2の数列になります。合体後の順番はソートされるので、数列をreverseするだけで通ります。
↑数列を反転させれば通るのに、サンプルを見てものすごく悩んでしまって嘘解法を投げました(懺悔)

B. Array Cancellation

問題概要

A_1+A_2+...+A_n=0となるような、長さNの数列が与えられます。この中から一度の操作につきi番目とj番目の要素を選び、i番目の要素に1を足し、j番目の要素から1を引きます。i < j であった場合にはコストがかからず、そうでない場合には1回の操作で1コストかかります。
数列の要素を全て0にするために必要な最小のコストを求めてください。

考え・反省

「今まで出てきた正の数の和」を持っておき、もし負の数が出てきたらそこから引いていきます。これを最後まで繰り返すと、数列の和が0になることから、「残った負数の和」と「残った正数の和」は等しいので、その絶対値を出力します。
A_1+A_2+...+A_n=0という条件を見逃していて、無限に不可能なパターンについて考えていました。涙。

C. Balanced Bitstring

問題概要

0,1,?だけで構成された長さNの文字列が与えられます。?には0,1の好きな方を選んで置換します。この文字列の中から連続したK個(Kは偶数)を取り出した際、どの部分でも01の個数が等しくなるようにすることはできますか?

考え・反省

modごとに見るということを全く思いつきませんでした(反省)。
mod Kで等しくなる部分の文字がすべて同じで、かつ最初のK個が条件を満たしていればYES、そうでなければNOです。
たとえばS=11001100K=4のとき、最初のK個は「1100」で、1個右にずらした部分からK個取ると「1001」です。最初のK個が条件を満たしていてくれれば、抜き出す部分を1個右にずらした際に新しく部分文字列に入った文字(右端)と、左端にあった捨てる文字が等しいことで、1と0の数の均衡を保てます。
もし最初のK個の中に?が含まれていた場合は未確定にしておいて、途中で01が出てきたら確定させます(そして確定後の文字列が条件を満たすか確認します)。

D. Tree Tag

問題概要

AliceとBobはN頂点の木グラフ🌲の上で鬼ごっこをします。最初はAliceが頂点A、Bobが頂点Bにいて、Alice→Bobの順番で移動します。一回の移動でAliceは最大dA、Bobは最大dBの距離を移動できます(ここでの距離とは頂点間の辺の数を指します)。この移動を10^{100}回する間に、AliceがBobと同じ座標に辿り着けたらAliceの勝ち、そうでなければBobの勝ちです。鬼ごっこの勝者を出力してください。

考え

10^{100}回移動できる=いちいち二人の動作を追ってたら絶対に間に合わないので、何かしらの条件があるはず。移動回数が多い分Aliceが有利な気がする(?!)ので、「どうやったらBobが勝てるか」で少し考えてみます。

  • 初期配置で、Aliceとの距離がdA以上離れてないとダメ(最初の1手でAliceに追いつかれてしまうため)
  • 木の直径がある程度大きくないとダメ(Aliceがどの頂点にも1手で移動できる状態になると詰むため)

→「ある程度」がどのくらいか?を考えます。ちょうどグラフの真ん中らへんに立てば、木の直径が2*dA以下だとAliceはどこにでも行けてしまうので、それより大きい必要があります。

  • dB > 2*dA

→これ教えてもらうまで理解できませんでした……。
まず、頂点の数よりも移動可能回数のほうがずっと多いので、Bobは逃げ回るときに「Aliceのいる方向」へ逃げないといけない状況が生じます。その際、Bobの移動可能距離がAliceの「1手で移動可能な範囲」よりも大きければ、つかまってしまうゾーンを「飛び越えて」逃げ回ることができます。逆に、それよりBobの移動距離が小さい場合はどこかでAliceが1手で移動できる範囲に入らざるを得ず、捕まってしまいます。



競プロなんもわからん!解散!