yamake's blog

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

Codeforces Round #568 (Div. 2)

codeforces.com

上の回をやりました。

A~C2までの3完でした。終了後にDとEを解きました。

A. Ropewalkers

ソートしてmax(0,d-a[1]+a[0])+max(0,d-a[2]+a[1])

B. Email from Polycarp

それぞれをランレングス圧縮をして、圧縮後の長さが同じかつ、全てのindexについて(同じ圧縮後のsとtが同じ文字∧sの長さ<tの長さ)を満たしていればYES、そうでなければNOを出力。

C1, 2. Exam in BerSU

C2の解法を書きます。

i人目まで見た時、i-1番目以下の全員が問題を解くのにかかった時間の総和をsumとします。また、1\sim 100のそれぞれについてt[i]として何度登場したかをmemoに記録しておきます。

 

t[i]+sum\leq mのとき

0を出力。

 

t[i]+sum\gt mのとき

 100から降順に

sum+t[i]-memo[num]\leq mとなるかを調べます。

falseのとき

sum-=memo[num],\ res+=memo[num]としてnumを1つ小さくします。

 

trueのとき

二分探索をして何人消せばいいのかを求めます。

 

計算量はO(N\times 100\times \log(N))です。

 

D. Extra Element

バチャ中は無限場合分け編をしてずっと詰まってACできませんでした。

解説の方針がスッキリしていてわかりやすかったです。

 上のツイートに、b[2]-b[1]が他全部と一致する->b[0]を消して終わり。を加えて終わりです。

 

E. Polycarp and Snakes

問題を読んだ瞬間に「これ情報オリンピック過去問でやったやつだ!!」となりましたが、よく読むと結構違いました。似てる奴

似てる奴のコードをコピペしてちまちま直してたけど、結構違ったので結局新しく書きました。

パット見トポソして構築なんですが、よく見るとaから順番に書いていくとあるので、素直にaから順番に書いていくだけで良いです。

具体的にはそれぞれの文字について、登場した座標の上下左右について端っこのものを記録します。

2 2

bb

cc

のaのように登場していない文字については適当な登場した文字と全く同じ上下左右端を持たせて大丈夫です。

新しい紙を用意して

それぞれの文字についてup\neq down \cap left \neq rightとなる文字があればNOを出して終了、そうでなければ(up,\ left)を左上に(down,\ right)を右下に持つ長方形領域にその文字を記入していきます(最初の条件の否定よりこの長方形は幅もしくは高さが1になる。)。

最後に新しい紙と入力で与えられた紙が一致するかを調べて終わりです。

計算量はO(HW)です。

 

2020/12/05 19:46追記

F. Two Pizzas

友人の好きな具材の集合、ピザに乗っている具材の数がそれぞれ高々9個しかないので、それぞれ高々512通りしか存在しません。

友人、ピザそれぞれの必要な情報(index, cost)を保ちながら512通りに分けて記録を行います。ピザの組み合わせによて得られる具材の集合も高々512通りなのでここも情報を圧縮できます。

最終的に必要なものは

f[bit]:=好きな具材の集合がbitである友人の数

c[bit]:=載ってる具材の集合がbitであるピザとなる組み合わせで最もcostが低いものとそのindexの組。

です。

最後に全てのc[i]について全てのf[j]について、f[j]\times (int)(j==(i\ and\ j))の総和が最も大きくなる中でc[i].costが最も小さくなる組み合わせが答えになります。

計算量はO(2^{a_{max}}\times 2^{b_{max}}+O(N+M) )です。

こういう時(計算量が定数に落ち着くとき)、計算量ってどうやって表記したらいいんでしょう......?わかる方いたら是非教えてくださいm(_ _)m(2020/12/05 20:07追記: a_{max}, b_{max}をつかったら良さそうですね。)