yamake's blog

主に競プロ、たまに自転車

Codeforces Round #604 A~Eまで

この回のバチャをやりました。

A~Eの5完です。

20:00~だと思いこんでいたらバチャの開始時刻が21:00~だったので盛大にフライングしてしまいました。

まあ、みなさんが走り終わるまでに解説を書きたかったということでどうにか......

 

A. Beautiful String

Aからまあまあ重くありませんか?

?以外の部分に被りがあるかをチェックする

被りがなければ、前から順番に?を見ていって、

まだ埋めていない?をaだと思って?に入れれる文字を入れていきます。

 

B. Beautifl Numbers

m beautifulのとき、要素a_iが全て1\leq a_i\leq mを満たす長さmの連続部分列が存在します。

したがって、i beautifulであるかを調べるためには

1~nのインデックスを配列{x}に保存し、

1\leq i \leq niについて

max_{1\leq k\leq i}\{x_k\}-min_{1\leq k\leq i}\{x_k\}+1==i

を調べれば良いです。(連続部分列になっているならその長さはiに一致するので)

 

C. Beautiful Regional Contest

同じ数字同士は同じ賞を受賞しなければならないので分けて考える必要がありません。そこで、実装を楽にするためにRun Length 圧縮をします (しなくてもできますが、しないと実装が重くなります)。

金メダリストはAC数の一番多いグループだけで十分です。

次に、銀メダリストの数が金メダリストの数を超えるまでAC数の多いグループごとに追加していきます。

銅メダリストも同様です。

メダリストの数がn/2以下であれば、n/2を超えない範囲でメダルを与えるグループを追加していきます。

最後に、メダリストの合計数がn/2を越えていないかチェックします。

 

D. Beautiful Sequence

この問題の制約において、03は隣に来る文字が確定しています。

なので、基本的には最初に03を全て使って

配列fr

f=0101...01となるようにr=2323...23作ります。

 

 このとき1と2が足りなくなってしまったら答えはNOです。

次にfrの間を2121...21で埋めます。

 

すると、配列は

0101...012121...212323...23となります。

 

ここで、12の多い方はまだ残っている可能性があります。

しかし、どちらも挿入できる場所は両端の1箇所しかありません。

したがって1もしくは2が2個以上余ってしまったら答えはNOです。

 

また、01が両方0個もしくは23が両方0個のとき

0101010のように並べることができます。

この場合も忘れずにチェックするとACすることができます。

僕はこのとき"YES"を出力し忘れて40分溶かして5ペナを吐きました。

 

E. Beautiful Mirrors

Aの次に簡単でした。

i日目までにかかる期待値をE(i)とすると、i日目にbeautifulと言われてi+1日目に進める期待値は(E(i)+1)\times \frac{100}{p[i]}です。

これを計算していけば終わりです。