この記事では、python3で競技プログラミングを始めるにあたって知っておくとお得なことをまとめました。
pythonなどの高級な言語は、競技プログラミング向けでないと思われがちです。実際、ほとんどのレッドコーダーはC++をメインにやっており、時々JavaやC#を使う人がいるって程度です。しかし、pythonだけで(少なくとも)オレンジコーダーになることは可能です。(ちなみにこの記事を書いてる人は青コーダーです)
なぜpythonか
メリット
- 書きやすい
- 読みやすい
- C++などと比べてコード量を小さくできる(早解きや実装が重いときに有利)
- numpyとscipyが便利かつ速い(Atcoderに限る)
- 使ってる人が多いのでわからないことはググれば大体出てくる
- 標準ライブラリが豊富
デメリット
- どうしても解けない(TLEする)問題がある
ですが安心してください。ほとんどの問題は解けます。
知ってるとお得な標準ライブラリのモジュール
pythonには強力な標準ライブラリがあります。物によってはCなどで実装されてる機能もありかなり速いです。
collections
(様々なコンテナデータ型)
-
deque
両端での出し入れが速いキュー。list
は末尾の出し入れについてのみ高速。 -
defaultdict
ファクトリ関数を呼び出して存在しない値を供給する辞書。 -
Counter
数え上げをしてくれるset
。たまに使うと楽なことがある。
defaultdict
については、defaultdict(int)
やdefaultdict(list)
が頻出パターン。DPやグラフ系の問題で何かとお世話になります。
itertools
(イテレータに関わる便利グッズ)
ここではよく使うのだけ紹介しますが、他にも色々あります。
-
accumulate(p, func=sum)
累積和をとってくれる。関数を投げられるので累積maxなど何でもできる。 -
chain.from_iterable(iterable)
複数のiterableを連結してくれる。 -
product(p, q, ..., repeat=1)
直積集合。ネストしたforループと等価。グリッド内の点を全部巡回したいときなど -
permutations(p[, r])
長さrの重複なし順列 -
combinations(p, r)
長さrの重複なし組み合わせ
bisect
(二分探索)
heapq
(優先度付きキュー)
numpy/scipyを活用する
行列演算だけが取り柄だと思われがちですが、numpyを用いることで実行速度を速め、かつコードを簡潔にすることができます。
グリッド系
ARC089D Checker [np.cumsum
とスライス記法]
動的計画法(DP)
ABC113D Number of Amidakuji [行列積]
CODE FESTIVAL 2018 C 半分 [DPの状態にnp.array
]
グラフ
scipy.sparse.csgraph
には、グラフ関係のアルゴリズムが多数実装されていますので、是非使いたいところです。ダイクストラ法やクラスカル法はもちろん、二部グラフの最大マッチングなどもやってくれます。
PyPyを用いる
pythonで提出してTLEした場合は、他言語で書き直す前にPyPyでの提出をやってみてください。間に合う可能性があります。
おわりに
時間がなかったので大分やっつけな記事になってしまいまして、すいませんでした。質問や意見は@hahho28までお願いします。