玖溟アルゴノート
64講義。Pythonの基本からアルゴリズム、Python経験者向けC++移行まで。
講義内に基本128問と、計算量・高速化の追加32問があります。招待・ログインなしで読めます。
- まずは、1行を動かす
- 変数は「名前のついた値」
- 入力を受け取る
- 条件で道を分ける
- 繰り返しを1周ずつ追う
- 配列と添字を混同しない
- 文字列も順番に読める
- 関数で手順を切り出す
- 制約から計算量を見積もる
- 全探索は「漏れなく、重複なく」
- ソートで順序を作る
- set と辞書で「見たこと」を記録
- 最大公約数とユークリッドの互除法
- 累積和で区間を引き算にする
- 二分探索は「境界」を探す
- 尺取り法で左端も動かす
- 貪欲法は「よさそう」で決めない
- ビット全探索で部分集合を列挙
- 素数をまとめてふるいにかける
- 座標圧縮で値を順位に変える
- いもす法で区間更新を差分にする
- DPは「同じ続きをまとめる」
- BFSで重みなし最短路
- DFSと木の親子関係
- ヒープで今の最小値を取る
- Union-Findで連結を管理
- Dijkstraで重み付き最短路
- ナップサック:状態を何で持つか
- 剰余と組合せを安全に扱う
- Fenwick treeで更新つき累積和
- セグメント木は区間の集約器
- LISと「同じ長さなら末尾を小さく」
- DAG:依存関係の順に処理する
- 半分全列挙で指数を半分に
- 部分集合DPで履歴を圧縮する
- ダブリングで祖先を飛ぶ
- 区間DPは短い区間から
- 強連結成分を縮めてDAGにする
- 全方位木DPで根を付け替える
- 桁DPで巨大な範囲を数える
- Z-algorithmで接頭辞との一致を測る
- 幾何は外積の符号から
- 包除原理:重なりを引き戻す
- 最大流:残余辺で選択をやり直す
- 遅延評価:更新をまとめて運ぶ
- ポテンシャル付きDSU:差を保つ
- 行列累乗で線形遷移を飛ばす
- 畳み込みを「係数の組」で理解する
- ゲームDP:勝ち状態を定義する
- Mo法:質問の順番を変える
- 未知問に向かう:不変量と反例
- 高速解と愚直解をぶつける
- DP高速化は条件を証明してから
- 赤への練習:解説を閉じて再構成する
- PythonからC++へ:最初の提出
- 整数型とオーバーフロー
- listからvectorへ
- if・for・関数を書き換える
- sortとlower_bound
- dict・set・heapの対応
- コピー・参照と関数の引数
- 移植演習:累積和をC++で
- 負数の割り算と剰余の違い
- ACLへ進む:型と演算を揃える