上の回をやりました。
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の解法を書きます。
人目まで見た時、番目以下の全員が問題を解くのにかかった時間の総和をとします。また、のそれぞれについてとして何度登場したかをに記録しておきます。
のとき
を出力。
のとき
から降順に
となるかを調べます。
のとき
としてを1つ小さくします。
のとき
二分探索をして何人消せばいいのかを求めます。
計算量はです。
D. Extra Element
バチャ中は無限場合分け編をしてずっと詰まってACできませんでした。
解説の方針がスッキリしていてわかりやすかったです。
ソート後の配列をbとすると、b[2]-b[0]が他全部と一致するか調べたあとは全部の差分がb[1]-b[0]と一致するかを調べて
— やまけー (@yamake_cpp) 2020年12月3日
全部一致->最後のを消す
ひとつだけ一致しないかつ、次のと合わせると一致する->間のindexを出力
それ以外->cout<<-1<<endl;
上のツイートに、b[2]-b[1]が他全部と一致する->b[0]を消して終わり。を加えて終わりです。
E. Polycarp and Snakes
問題を読んだ瞬間に「これ情報オリンピック過去問でやったやつだ!!」となりましたが、よく読むと結構違いました。似てる奴
似てる奴のコードをコピペしてちまちま直してたけど、結構違ったので結局新しく書きました。
パット見トポソして構築なんですが、よく見るとaから順番に書いていくとあるので、素直にaから順番に書いていくだけで良いです。
具体的にはそれぞれの文字について、登場した座標の上下左右について端っこのものを記録します。
2 2
bb
cc
のaのように登場していない文字については適当な登場した文字と全く同じ上下左右端を持たせて大丈夫です。
新しい紙を用意して
それぞれの文字についてとなる文字があればNOを出して終了、そうでなければを左上にを右下に持つ長方形領域にその文字を記入していきます(最初の条件の否定よりこの長方形は幅もしくは高さが1になる。)。
最後に新しい紙と入力で与えられた紙が一致するかを調べて終わりです。
計算量はです。
2020/12/05 19:46追記
F. Two Pizzas
友人の好きな具材の集合、ピザに乗っている具材の数がそれぞれ高々9個しかないので、それぞれ高々512通りしか存在しません。
友人、ピザそれぞれの必要な情報(index, cost)を保ちながら512通りに分けて記録を行います。ピザの組み合わせによて得られる具材の集合も高々512通りなのでここも情報を圧縮できます。
最終的に必要なものは
f[bit]:=好きな具材の集合がbitである友人の数
c[bit]:=載ってる具材の集合がbitであるピザとなる組み合わせで最もcostが低いものとそのindexの組。
です。
最後に全てのについて全てのについて、の総和が最も大きくなる中でが最も小さくなる組み合わせが答えになります。
計算量はです。
こういう時(計算量が定数に落ち着くとき)、計算量ってどうやって表記したらいいんでしょう......?わかる方いたら是非教えてくださいm(_ _)m(2020/12/05 20:07追記: をつかったら良さそうですね。)