LoginSignup
17
30

More than 5 years have passed since last update.

python de 競技プログラミング

Last updated at Posted at 2018-12-13

この記事では、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までお願いします。

17
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
30