Ruteのプログラミング日記

競技プログラミング(AtCoder)の問題の解説や、過去問を解いた感想、また解けない過去問について共有したいと思ってます。

AtCoder Beginner Contest 164 感想&反省

AtCoder Beginner Contest 164が終了しました。お疲れ様でしたー。

 

今回のコンテスト、気になったのですが...

 

ズバリ "ABC早解きコンテスト" だったと思います。

(A問題、B問題、C問題を早く解くことと、ABC○○コンテストにあやかってこのような名称としました)

D問題がかなり難しかったみたいです...

f:id:Rute_programming:20200426221152p:plain

▲D問題難しかったですね....

 

Twitterなどで私が何度も言及した"C問題とD問題の間にある壁"が今回はより一層分厚かったように感じます。

個人的には、このような問題セットもアリだとは思うのですが、おそらく今回のコンテスト、早解きをした方ほどパフォーマンスが高くなる傾向になったのではないでしょうか?(私は3完早解き上位20人くらいに入っていたと思います)

 

A問題 A - Sheep and Wolves

https://atcoder.jp/contests/abc164/tasks/abc164_a

W ≧Sかどうかを判定し、W≧Sならば"unsafe",そうでなければ"safe"と出力すれば良いです。

コード: https://atcoder.jp/contests/abc164/submissions/12332240

 

B問題 B - Battle

 https://atcoder.jp/contests/abc164/tasks/abc164_b

以下のようなループを変数iを用いて有限回回します(私は10^5回としました)

iを2で割った余りが0なら、CC-Bにする。

もしCが0以下ならば"Yes"と出力する。

iを1で割った余りが0なら、AC-Dにする。

もしAが0以下ならば"No"と出力する。

 いずれの場合でも、何らかの文字列を出力した段階でループを終了する。

これにより、この問題を解くことが可能です。

コード: https://atcoder.jp/contests/abc164/submissions/12339019

 

C問題 C - gacha

https://atcoder.jp/contests/abc164/tasks/abc164_c

 

何種類の景品を手に入れたでしょう?と聞いて思いつくのは

全ての入力(S_i)をリストにして、それを集合にして 集合の要素の個数を出力する

ということです。

Pythonでは、set(A)を実行することにより、リストAの要素の集合を作成することが出来ます。

また、list(set(A))を実行することにより、リストAの要素の集合をリストとしたものを出力することが出来ます。

集合の要素の数はlen(list(set(A)))などで求めることが出来るので、これで求められる値を出力すればよいでしょう。

以下、方針です

k = [空のリスト]とする

N回以下のループを実行する

  kに文字列S_iを挿入する

リストkの集合の要素の個数を出力する

計算量はO(N)です。

コード: https://atcoder.jp/contests/abc164/submissions/12341880

 

D問題 D - Multiple of 2019

https://atcoder.jp/contests/abc164/tasks/abc164_d

聞いたことがある気がするのですが

長さNの文字列の部分文字列の個数は \frac{N(N+1)}{2}個だったと思います。

<証明>

長さNの文字列において

長さ1の部分文字列の個数はN個です。

長さ2の部分文字列の個数は、連続した2文字を選ぶのでN-1個です。

長さNの部分文字列の個数は長さNの文字列しか考えられないので1個です。

 

以上のことから、部分文字列の個数は\sum_{k=1}^{N} k=\frac{N(N+1)}{2}個であるといえます。

今回の制約では、1≦|S|≦2×10^5だったので、最大で20000100000(200億)個の部分文字列を考えないといけなかったのです。当然、PythonどころかC++でも列挙するまでにTLEになりそうだと思い、さじを投げました。orz

 

今回は先述した通りABC早解きコンテストになったということで、予想よりパフォーマンスが高く出たと感じた方が多かったと思います。私もおそらく初の水パフォになりそうです。

 

以上、ABC164の感想&反省でした。

(レートが冷えてしまった方、私を恨まないようにお願いしますよ....)