第1章 算法设计基础 1
1.1 思维的体操 1
1.2 问题求解常见策略 14
1.3 高效算法设计举例 36
1.4 动态规划专题 55
1.5 小结与习题 71
1.5.1 问题求解策略 72
1.5.2 高效算法设计 80
1.5.3 动态规划 83
第2章 数学基础 86
2.1 基本计数方法 86
2.2 递推关系 92
2.3 数论 101
2.3.1 基本概念 102
2.3.2 模方程 107
2.3.3 线性筛 113
2.3.4 积性函数与莫比乌斯反演 116
2.3.5 筛法求解积性函数 118
2.4 组合游戏 124
2.5 概率与数学期望 130
2.6 置换及其应用 135
2.7 矩阵和线性方程组 142
2.8 快速傅里叶变换(FFT) 154
2.9 数值方法 165
2.10 小结与习题 171
2.10.1 组合计数 173
2.10.2 数论 177
2.10.3 组合游戏 181
2.10.4 概率 183
2.10.5 置换 184
2.10.6 矩阵与线性方程组 186
2.10.7 快速傅里叶变换(FFT) 188
2.10.8 数值方法 189
第3章 实用数据结构 192
3.1 基础数据结构回顾 192
3.1.1 抽象数据类型(ADT) 192
3.1.2 优先队列 194
3.1.3 并查集 197
3.2 区间信息的维护与查询 199
3.2.1 二叉索引树(树状数组) 200
3.2.2 RMQ问题 202
3.2.3 线段树(1):点修改 204
3.2.4 线段树(2):区间修改 207
3.3 字符串(1) 219
3.3.1 Trie 219
3.3.2 KMP算法 222
3.3.3 Aho-Corasick自动机 225
3.4 字符串(2) 229
3.4.1 后缀数组 229
3.4.2 最长公共前缀(LCP) 233
3.4.3 基于哈希值的LCP算法 235
3.4.4 回文的Manacher算法 238
3.5 字符串(3) 240
3.5.1 后缀自动机的性质 241
3.5.2 后缀链接树(Suffix Link Tree) 241
3.5.3 后缀自动机的构造算法 242
3.6 排序二叉树 255
3.6.1 基本概念 255
3.6.2 用Treap实现名次树 258
3.6.3 用伸展树实现可分裂与合并的序列 266
3.7 树的经典问题与方法 270
3.8 动态树与LCT 289
3.9 离线算法 299
3.10 kd-Tree 312
3.11 可持久化数据结构 319
3.12 小结与习题 331
3.12.1 基础数据结构 332
3.12.2 区间信息维护 333
3.12.3 字符串算法 335
3.12.4 排序二叉树 338
3.12.5 树的经典问题与方法 339
3.12.6 动态树与LCT 342
3.12.7 离线算法 344
3.12.8 kd-Tree 347
3.12.9 可持久化数据结构 348
第4章 几何问题 351
4.1 二维几何基础 351
4.1.1 基本运算 352
4.1.2 点和直线 353
4.1.3 多边形 355
4.1.4 例题选讲 356
4.1.5 二维几何小结 359
4.2 与圆和球有关的计算问题 360
4.2.1 圆的相关计算 360
4.2.2 球面相关问题 366
4.3 二维几何常用算法 366
4.3.1 点在多边形内的判定 366
4.3.2 凸包 368
4.3.3 半平面交 372
4.3.4 平面区域 378
4.4 三维几何基础 382
4.4.1 三维点积 383
4.4.2 三维叉积 384
4.4.3 三维凸包 386
4.4.4 例题选讲 388
4.4.5 三维几何小结 392
4.5 小结与习题 393
4.5.1 基础题目 393
4.5.2 二维几何计算 395
4.5.3 几何算法 398
4.5.4 三维几何 403
第5章 图论算法与模型 408
5.1 基础题目选讲 408
5.2 深度优先遍历 411
5.2.1 无向图的割顶和桥 413
5.2.2 无向图的双连通分量 416
5.2.3 有向图的强连通分量 420
5.2.4 2-SAT问题 424
5.3 最短路问题 428
5.3.1 再谈Dijkstra算法 428
5.3.2 再谈Bellman-Ford算法 432
5.3.3 例题选讲 436
5.4 生成树相关问题 443
5.5 二分图匹配 447
5.5.1 二分图最大匹配 447
5.5.2 二分图最佳完美匹配 448
5.5.3 稳定婚姻问题 452
5.5.4 常见模型 455
5.6 网络流问题 457
5.6.1 最短增广路算法 457
5.6.2 最小费用最大流算法 462
5.6.3 建模与模型变换 464
5.6.4 例题选讲 467
5.7 小结与习题 472
5.7.1 基础知识和算法 472
5.7.2 DFS及其应用 472
5.7.3 最短路及其应用 476
5.7.4 最小生成树 477
5.7.5 二分图匹配 479
5.7.6 网络流 480
第6章 更多算法专题 484
6.1 轮廓线动态规划 484
6.2 嵌套和分块数据结构 490
6.3 暴力法专题 500
6.3.1 路径寻找问题 500
6.3.2 对抗搜索 505
6.3.3 精确覆盖问题和DLX算法 510
6.4 几何专题 516
6.4.1 仿射变换与矩阵 516
6.4.2 离散化和扫描法 518
6.4.3 运动规划 527
6.5 数学专题 529
6.5.1 小专题集锦 530
6.5.2 线性规划 532
6.6 浅谈代码设计与静态查错 533
6.6.1 简单的Bash 533
6.6.2 《仙剑奇侠传四》之最后的战役 542
6.7 小结与习题 548
6.7.1 轮廓线上的动态规划 548
6.7.2 数据结构综合应用 550
6.7.3 暴力法 557
6.7.4 几何专题 562
6.7.5 数学专题 567
6.7.6 代码组织与调试 569
附录 Java、C#和Python语言简介 575
主要参考书目 582