様々なアルゴリズムを AtCoder 側で実装した
AtCoder Library Practice Contest
- 練習用コンテストで一通りACした解説
とりあえず確認してみたら1/3から1/2くらい既に実装してあった。今はリポジトリにバラバラに散らばってるので後でACLと同じディレクトリ構造にしてMITライセンスにしとこう。 残りの未実装なものは公式が「これは頻出アルゴリズムだ」と言ってるわけだからなるはやで実装する。
AtCoder Library の Python 実装,普通にいろんなアルゴリズムを実装するとかはすでにいっぱいある(≒ yosupo judge や AOJ から取ってこればよい)はずだから,numpy/scipy/networkx とか cython とかでゴリゴリに高速化したものができてほしい src
- Practice ContestのAll Submitの所要時間順ランキングがライブラリ速度を競い合う場になるのではないかと思ってる
- 僕は以前NumbaやCythonでの高速化にハマってたのだけど、最近は一周回ってPyPyで柔軟性を犠牲にせずに速くすることに興味がある
内容
- フェニック木
- 部分和の計算と要素の更新の両方を効率的に行える木構造(Binary Indexed Treeとも呼ばれる)
- B: 600ms PyPy暫定一位
- セグメント木 J - Segment Tree 454 msPyPy暫定一位 K - Range Affine Range Sum
- 固定個数の要素がランダムアクセスで更新される時に総和や最小値をO(logN)で求めることができる木
- 遅延伝搬セグメント木 L - Lazy Segment Tree
- 文字列アルゴリズム詰め合わせ
- 接尾辞配列
- LCP array I - Number of Substrings
- 752ms PyPy暫定一位
- z_algorithm
- 数学アルゴリズム詰め合わせ
- pow_mod
- inv_mod
- crt
- floor_sum
- 畳み込み F - Convolution
- Pythonだとnp.convolveとかに相当するやつ
- Two Snukeではint64に収まらなくて自前でやった
- Modint 自動でmodを取る構造体
- Pythonだと演算子のオーバーロードで実現したら見た目は綺麗だけど、これを使うシチュエーションは関数呼び出しのオーバーヘッドを払えない状況だと思う
- 長整数が速いを使った攻略が良さそう
- グラフ
- DSU
- Maxflow 最大流 D - Maxflow
- MinCostFlow 最小費用流 E - MinCostFlow
- SCC G - SCC
- 有向グラフを強連結成分分解
- 2-SAT H - Two SAT
- の形の論理式を充足する割当が存在するかを判定し、する場合にはその割当の一つを得る
ここで練習できる