参考サイト:
AtCoderのF問題をやっていると、同じ解法なのに、なぜかTLE(時間オーバー)になってしまう事があります。
原因がわからないため、何時間も迷路に迷い込みます。
たとえば、
・関数化と直書きの違い?
・変数を経由させるのと一行で書くのの違い?
など。
実際は、上記の違いはAC
とTLE
を分けるほどのレベルではありません。
(実際に時間を計測したら、自分の方が速い場合もある)
違いは、Python3
で提出したか、 PyPy3
で提出したかの違いだけでした。
たとえば、2022/11/5 (AtCoder Beginner Contest 276)のF問題
詳細は割愛しますが、フェニック木を使って $O(N^2)$ の内容を$O(log(N))$の計算量で解きます。
しかし・・・・
Python3
で提出すると、それでもTLE
になります。
(私のローカルPCの環境では$N=10^5$で、2.3-2.8秒)
逆に、PyPy3
で提出すると、セグメント木で、ビット演算の表記 (i & -i
など)を使わなくても、AC
となります。
結果一覧を検索する時に、言語をPython3
にしても、PyPy3
も一緒に表示されるため、提出時にPyPy3
が選べる、という事に気づきませんでした。
これは、知らなければ確実にハマる内容です。
私も、ハマった挙句、ネットを検索して、表題の結論にたどり着きました。