基礎#
基本語法#
- 輸入輸出
- 變數、資料型態
- 運算子
- 算術、關係、邏輯、位元、賦值、條件運算子
- 指標與引用
- <iomanip>
- 判斷式
- if / else
- switch
- 迴圈
- for
- ranged-based for
- while
- do-while
- continue
- break
- 陣列
- 字串
- 函式 & 遞迴
- 參考與指標
- 傳值、傳址、傳參考
- 結構 struct
- 時間 / 空間複雜度觀念
STL#
- pair
- tuple
- vector
- stack
- queue
- deque
- list
- set / multiset / unordered_set / unordered_multiset
- map / multimap / unordered_map / unordered_multimap
- priority queue
- bitset
- STL Algorithm
- sort
- 自訂比較器 comparator
- reverse
- lower_bound / upper_bound
- is_permutation / next_permutation / prev_permutation
- find
- set.find()
- memset
- accumulate / partial_sum
- sort
語言特性與實用技巧#
- structured binding
- reference &
- Range-based for
- 匿名函數 Lambda
- inline
- define
- IO 優化
- while (n–)
- 字尾空白與行尾換行
- <bits/stdc++.h>
- using
- mt19937
基本技巧#
- 枚舉
- 暴力枚舉
- 位元枚舉
- 枚舉子集
- 折半枚舉 Meet in the Middle
- 模擬、個案分析與 Ad hoc
- 排序
- bubble sort
- insertion sort
- counting sort
- radix sort
- heap sort
- quick sort / merge sort(見「分治」)
- 二分搜與三分搜
- 基本二分搜
- 對答案二分搜
- 三分搜
- 雙指針/滑動窗口
- 貪心
- 排程問題
- 期限與任務
- 交換論證 Exchange Argument
- 分治
- 河內塔
- merge sort
- quick sort
- 平面最近點對
- 倍增
- 前綴和
- 差分
- 離散化
- 構造
- 單調棧 Monotonic Stack
- 單調隊列 Monotonic Queue
搜尋#
- 回溯法
- 剪枝
- 雙向搜索
- 迭代加深 IDDFS
- 啟發式搜索 A*
- IDA*
- Dancing Links
基本資料結構#
- STL 容器內部原理(vector / deque / set / map 等的實作)
- 二元堆積 Binary Heap
- BIT 樹狀數組
- 加上差分達成區間加值
- 併查集 Disjoint Set
- 稀疏表 Sparse Table
- 線性碰撞、自訂雜湊
- pbds
基礎動態規劃#
- 記憶化搜索
- 背包 DP
- 0/1 背包
- 完全背包(無限背包)
- 多重背包(有限背包)
- 二進制分組優化
- 分組背包
- 滾動陣列
- LCS/LIS
- 路徑 DP
- 區間 DP
- DAG DP
- 狀態壓縮(位元)DP
- 數位 DP
- 機率/期望值DP
- DP 回溯
基礎圖論#
- 圖的表示法
- 相鄰矩陣
- 相鄰串列
- 常數優化 : 鏈式前向星
- 圖的遍歷
- 連通塊
- Functional Graph 與循環節偵測
- 拓撲排序
- 二分圖
- 二分圖判定
- 二分圖最大匹配
- 圖的連通性
- 割點和橋
- Tarjan’s Bridge-Finding Algorithm
- 邊雙連通分量
- 點雙連通分量
- 強連通分量
- Tarjan’s SCC Algorithm
- Kosaraju’s Algorithm
- 割點和橋
- 歐拉路徑與歐拉迴路
- 哈密頓路徑
- 最短路徑
- 單點源
- Dijkstra’s Algorithm
- Bellman Ford’s Algorithm and SPFA
- 0-1 BFS
- 多點源
- Floyd-Warshall’s Algorithm
- 差分約束
- 單點源
- 樹
- Euler Tour / 樹壓平
- 最近共同祖先 LCA
- 樹的直徑
- 樹的中心
- 樹重心
- 最小生成樹
- Kruskal
- Prim
進階#
進階資料結構#
- 線段樹基礎
- 懶標記
- 值域線段樹
- 線段樹上二分搜
- 線段樹進階
- 動態開點
- 持久化
- 線段樹合併與分裂
- 掃描線求矩形面積/周長並
- 套其他資料結構
- 線段樹分治
- 李超線段樹
- 吉如一線段樹
- 二維資料結構
- 2D BIT
- 2D 線段樹
- 平衡樹
- 樹堆 Treap
- Splay Tree
- AVL Tree
- 笛卡爾樹
- 樹套樹
- 動態樹 Link-Cut Tree
字串#
- 基礎
- Rolling Hash
- KMP
- Z Value
- Manacher
- 最小表示法
- 進階
- Suffix Array / Tree
- 後綴自動機
- 回文樹
- Lyndon 分解
- 應用
- Trie
- AC 自動機
- 表達式求值
數學#
- 數論
- 整除性
- 最大公因數和最小公倍數
- 輾轉相除法
- 擴展歐幾里得算法
- 篩法
- 埃式篩法
- 線性篩法
- 質因數分解
- Miller-Rabin 質數判定
- Pollard’s Rho 分解
- 模運算
- 同餘性與模數
- 快速冪
- 費馬小定理與歐拉定理
- 反元素
- 乘法反元素表
- 矩陣快速冪
- 組合計數
- 加法和乘法原理
- 排列與組合
- 鴿籠原理
- 容斥原理
- 卡特蘭數
- 斯特林數、貝爾數、分拆數
- Burnside’s lemma
- 圖論計數
- Prüfer 序列
- 矩陣樹定理
- LGV 引理
- 線性代數
- 高斯消去法
- 線性基 Linear Basis
- 多項式與生成函數
- FFT/IFFT
- NTT
- FWT
- 生成函數
- 拉格朗日插值
- 標準無偏賽局
- 賽局和、型別、等價賽局
- Nim
- Choose Nim
- MEX Principle
- Sprague–Grundy Theorem
- 標準有偏賽局
- Red-Blue-Hackenbush
- 二進分數
- Simplicity Principle
- 延伸
- 歐拉函數
- 中國剩餘定理
- 盧卡斯定理
- 原根與離散對數 BSGS
- 數論函數
- 莫比烏斯反演
進階動態規劃#
- DP 優化
- 前綴優化
- 單調隊列優化
- 資料結構優化
- 矩陣快速冪優化
- SOS 位元 DP 優化
- 斜率優化
- 分治優化
- 四邊形不等式優化(Knuth’s Optimization;2D/1D)
- 1D/1D 凹/凸優化與 SMAWK
- Aliens 優化(WQS 二分)
- slope trick
- 樹形 DP
- 換根 DP
- 高維 DP
- 輪廓線 DP
- 插頭 DP
進階圖論#
- 樹上問題
- 樹上啟發式合併 Small-to-Large
- 樹鏈剖分 Heavy-Light Decomposition
- 樹分治
- 虛樹
- 圓方樹
- 2-SAT 問題
- 網路流
- 最大流/最小割
- Ford Fulkerson’s Method
- Edmonds-Karp’s Algorithm
- Dinic’s Algorithm
- 上下界網路流
- 最小費用流 MCMF
- 最大流/最小割
- 圖的匹配
- 二分圖最大匹配
- Hopcroft-Karp
- Hungarian
- 一般圖最大匹配(帶花樹)
- 二分圖最大匹配
- 最小樹形圖
- 斯坦納樹
- 支配樹
- Matroid 與擬陣交
根號算法#
- 根號分解
- 序列分塊
- 樹分塊
- 值域分塊
- 數論分塊
- 操作分塊
- 莫隊算法
- 帶修改莫隊算法
- 回滾莫隊
計算幾何#
- 向量定義、內積、外積
- 方向判定、極角排序
- 線段相交
- 鞋帶公式
- Pick’s Theorem
- 凸包
- 旋轉卡尺
- 半平面交
- 圓的運算
- 圓與線、圓與圓的交點
- 公切線
- 最小圓覆蓋(隨機增量法)
- 極角掃描線
- 旋轉掃描線
- Minkowski Sum
雜項#
- 高精度計算
- 離線算法
- CDQ 分治
- 整體二分(莫隊家族見「根號算法」)
- 隨機化
- 隨機化技巧
- 爬山算法
- 模擬退火
- 分數規劃
- 珂朵莉樹(顏色段均攤)
- 約瑟夫問題
- 交互題
