人工知能と競プロやってくブログ

深層学習・機械学習・AI・atcoder・競技プログラミングについて調べてやってみたことをまとめるブログです

AtCoder Beginner Contest 143 [ D - Triangles ]をPythonで解く(400点、🟫茶diff)

問題

atcoder.jp

解法その1 numpy + njitを使ったO(N3)解法 

なんと、何も考えずに問題通り、総当たりコードを書くとACしてしまうという解法。
マジですか。

AtCoderPythonではnumpyが使用できるが、njitを使って関数の実行速度を高速化。
実行すると、1731msくらいでACする。

問題の制約が、3 < N < 2 * 103
とすると、O(N3)は、(2 * 103)3なので、8 * 109
108をオーバーするので、普通はTLEだろうと見込んでスルーする実装だが、njitを使うことで実は間に合ってしまう。

なるほどねー。わからないから、とりあえずnjitでも使ってみるか。
という選択肢もアリってことかな?

とりあえず作問した人は想定してなかった解答だろうな。

実装その1

解法その2

問題の制約が、3 < N < 2 * 103
全探索は109オーバーなので、数学的な最適化を狙う方法。
atcoderの通常パターンなら、こう考えるべきだがw

a < b < c と考える。
a, bに総当たりならば(2 * 103)2 = 4 * 106
cの値は計算で求める。
c < a + b
であるあから、a + b以下の要素がLの中に何個あるかを二分探索で求める。
cはbより大きいから、b+1以上の要素が下限。

Lの中からa+b以下、b+1以上の要素数を引き算で出せば終了。
計算量はO( N2 logN)

実装その2

参考

atcoder.jp

youtu.be

https://img.atcoder.jp/abc143/editorial.pdf