×
超值优惠券
¥50
100可用 有效期2天

全场图书通用(淘书团除外)

关闭
暂无评论
图文详情
  • ISBN:9787302571742
  • 装帧:一般胶版纸
  • 册数:暂无
  • 重量:暂无
  • 开本:16开
  • 页数:600
  • 出版时间:2021-05-01
  • 条形码:9787302571742 ; 978-7-302-57174-2

本书特色

作者授课视频资源:https://www.bilibili.com/video/av94769035 《算法竞赛入门经典——训练指南(升级版)》是算法届大神刘汝佳所著信息学奥赛红宝书——《算法竞赛入门经典》的拓展训练用书。 训练指南2021新版增补了大量ACM/ICPC/NOI/NOIP的新知识点和新题型,优化了部分算法模板,扩增了分类专项练习题。 这是一本单书销售9万册,丛书销售35万册,连UVa线上评测系统创始人、ACM/ICPC国际指导委员Miguel A.Revilla都推荐的算法竞赛训练题集。 这是一本在程序员中家喻户晓、被大量学校广泛采作教材的算法竞赛经典之作。 这不是一本入门图书。想看懂它,需要你具备一定的算法基础。 这本书,如果你能独立完成大部分,你的算法能力完全能达到现今IT公司内程序员的中上水准。 这本书和《算法竞赛入门经典(第2版)》珠联璧合,相辅相成。它会像朋友和知己一样,同你一起探讨和研究问题,直至你打开算法之美的大门! ACM入门经典,我们相见恨晚!!

内容简介

《算法竞赛入门经典——训练指南(升级版)》是《算法竞赛入门经典(第2版)》一书的重要补充,旨在补充原书中没有涉及或者讲解得不够详细的内容,从而构建一个更完整的知识体系。本书通过大量有针对性的题目,让抽象复杂的算法和数学具体化、实用化。 《算法竞赛入门经典——训练指南(升级版)》共包括6章,分别为算法设计基础、数学基础、实用数据结构、几何问题、图论算法与模型以及更多算法专题。全书通过206道例题深入浅出地介绍了上述领域的各个知识点、经典思维方式以及程序实现的常见方法和技巧,并在章末给出了丰富的分类习题,供读者查漏补缺和强化学习效果。 《算法竞赛入门经典——训练指南(升级版)》题目多选自近年来ACM/ICPC区域赛和总决赛真题,内容全面,信息量大,覆盖了常见算法竞赛中的大多数细分知识点。书中还给出了所有重要的经典算法的完整程序,以及重要例题的核心代码,既适合选手自学,也方便院校和培训机构组织学生学习和训练。

目录

第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


展开全部

节选

第 1章 算法设计基础 算法设计基础 在《算法竞赛入门经典(第2版)》一书中,已经讨论过算法分析、渐进时间复杂度等基本概念,以及分治、贪心、动态规划等常见的算法设计方法。本章是《算法竞赛入门经典(第2版)》的延伸,通过例题介绍更多的算法设计方法和技巧。 1.1 思维的体操 例题1 勇者斗恶龙(The Dragon of Loowater, UVa 11292) 假设你是一位国王,你的王国里有一条n个头的恶龙,你希望雇一些骑士把它杀死(即砍掉恶龙的所有头)。王国里有m个骑士可以雇用,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币。如何雇用骑士才能砍掉恶龙的所有头,且需要支付的金币*少?注意,一个骑士只能砍一个头(且不能被雇用两次)。 【输入格式】 输入包含多组数据。每组数据:**行为正整数n和m(1≤n,m≤20 000);接下来n行每行为一个正整数,即恶龙每个头的直径;再接下来m行每行为一个正整数,即每个骑士的能力。输入结束标志为n=m=0。 【输出格式】 对于每组数据,输出*少花费。如果无解,输出“Loowater is doomed!”。 【样例输入】 2 3 5 4 7 8 4 2 1 5 5 10 0 【样例输出】 11 Loowater is doomed! 【分析】 能力强的骑士开价高是合理的,但如果被你派去砍恶龙的一个很弱的头,就是浪费人 算法竞赛入门经典—训练指南 ·2· 才了。因此,可以把雇用来的骑士按照能力从小到大排序,把恶龙的所有头按照直径从小到大排序,一个一个砍就可以了。当然,不能砍掉“当前需要砍的头”的骑士就不要雇用了。代码如下。 #include #include // 因为用到了 sort using namespace std; const int maxn = 20000 + 5; int A[maxn], B[maxn]; int main() { int n, m; while(scanf("%d%d", &n, m) == 2 && n { while(scanf("%d%d", &n, m) == 2 && n { for(int i = 0; = A[cur]) { if(B[i] >= A[cur]) { cost += B[i]; cost += B[i]; // 雇用该骑士 if(++cur == n) break; if(++cur == n) break; // 如果头已经砍完,及时退出循环 } if(cur x.j; } }; int main() { int n, b, j, kase = 1; int n, b, j, kase = 1; while(scanf("%d", &n) == 1 && { &n) == 1 && { vector v; for(int i = 0; <> 算法的依据。 时间 交代执行 交代执行 交代执行 交待执行 时间 交代执行 交代执行 交代执行 交代执行 先后顺序是关键 B[Y]+B[X]+J[X] B[X]+B[Y]+J[Y] X Y Y X X Y Y X (a) (b) 图 1-1 例题3 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n 个人,每人有一定数量的金币,金币总数能被n 整除。每个人可以给他 左右相邻的人一些金币,*终使得每个人的金币数目相等。你的任务是求出被转手的金币 数量的*小值。比如,n=4,且4 个人的金币数量分别为1,2,5,4 时,只需转移4 枚金币(第 3 个人给第2 个人2 枚金币,第2 个人和第4 个人分别给第1 个人1 枚金币)即可实现每人 手中的金币数目相等。 【输入格式】 输入包含多组数据。每组数据:**行为正整数n(n≤1 000 000),以下n 行每行为 一个正整数,按逆时针顺序给出每个人拥有的金币数。输入结束标志为文件结束符(EOF)。 【输出格式】 对于每组数据,输出被转手金币数量的*小值。输入保证这个值在64 位无符号整数范 围内。 【样例输入】 3 100 100 100 4 1 第1 章 算法设计基础 ·5· 2 5 4 【样例输出】 0 4 【分析】 这道题目看起来很复杂,让我们慢慢分析。首先,*终每个人的金币数量可以计算出 来,它等于金币总数除以人数n。接下来我们用M 来表示每人*终拥有的金币数。 假设有4 个人,按逆时针顺序编号为1, 2, 3, 4。假设1 号给2 号3 枚金币,然后2 号又 给1 号5 枚金币,这实际上等价于2 号给1 号2 枚金币,而1 号什么也没给2 号。这样, 可以设x2 表示2 号给了1 号多少个金币。如果x2<0,说明实际上是1 号给了2 号-x2 枚金币。 同理,可以设x1,x3,x4,其含义类似。注意,由于是环形,x1 指的是1 号给4 号多少金币。 现在假设编号为i 的人初始有Ai 枚金币。对于1 号来说,他给了4 号x1 枚金币,还剩 Ai-x1 枚;但因为2 号给了他x2 枚金币,所以*后还剩A1-x1+x2 枚金币。根据题设,该金币 数等于M。换句话说,我们得到了一个方程:A1-x1+x2=M。 同理,对于第2 个人,有A2-x2+x3=M。*终,我们可以得到n 个方程,一共有n 个变 量,是不是可以直接解方程组了呢?很显然,还不行。因为从前n-1 个方程可以推导出* 后一个方程(想一想,为什么)。所以,实际上只有n-1 个方程是有用的。 尽管无法直接解出答案,但我们还是可以尝试着用x1 表示出其他的xi,则本题就变成 了单变量的极值问题。 对于第1 个人,A1-x1+x2=M ?? x2=M-A1+x1=x1-C1(C1=A1-M) 对于第2 个人,A2-x2+x3=M ?? x3=M-A2+x2=2M-A1-A2+x1=x1-C2(C2=A1+A2-2M) 对于第3 个人,A3-x3+x4=M ?? x4=M-A3+x3=3M-A1-A2-A3+x1=x1-C3(C3=A1+A2+ A3-3M) … 对于第n 个人,An-xn+x1=M。这是一个多余的等式,并不能给我们更多的信息(想一 想,为什么)。 我们希望所有xi 的绝对值之和尽量小,即1 1 1 1 2 1 1 | | | | | | | | n x x C x C x C ?? + ?? + ?? + + ?? 要* 小。注意到 |x1-Ci| 的几何意义是数轴上点x1 到点Ci 的距离,所以问题变成了:给定数轴上 的n 个点,找出一个到它们的距离之和尽量小的点。 下一步可能有些跳跃。不难猜到,这个*优的x1 就是这些数的“中位数”(即排序以 后位于中间的数),因此只需要排个序就可以了。性急的读者可能又想跳过证明了,但是 笔者希望您这次能好好读一读,因为它实在是太优美、太巧妙了,而且在不少其他题目中 也能用上(我们很快就会再见到一例)。 注意,我们要证明的是:给定数轴上的n 个点,在数轴上的所有点中,中位数离所有 顶点的距离之和*小。凡是能转化为这个模型的题目都可以用中位数求解,并不只适用于 本题。 算法竞赛入门经典—训练指南 ·6· 让我们把数轴和上面的点画出来,如图1-2 所示。 图 1-2 任意找一个点,比如图1-2 中的灰点。它左边有4 个输入点,右边有2 个输入点。把它 往左移动一点,不要移得太多,以免碰到输入点。假设移动了d 单位距离,则灰点左边4 个点到它的距离各减少了d,右边的两个点到它的距离各增加了d,但总的来说,距离之和 减少了2d。 如果灰点的左边有2 个点,右边有4 个点,道理类似,不过应该向右移动。换句话说, 只要灰点左右的输入点不一样多,就不是*优解。什么情况下左右的输入点一样多呢?如 果输入点一共有奇数个,则灰点必须和中间的那个点重合(中位数);如果有偶数个,则 灰点可以位于*中间的两个点之间的任意位置(还是中位数)。代码如下。 #include #include using namespace std; const int maxn = 1000000 + 10; long long A[maxn], C[maxn], tot, M; int main() { int n; while(scanf("%d", &n) == 1) { //输入数据大,scanf 比cin 快 tot = 0; //用%lld 输入long long for(int i = 1; i <= n; i++) { scanf("%lld", &A[i]); tot += A[i]; } M = tot / n; C[0] = 0; for(int i = 1; i < n; i++) C[i] = C[i-1] + A[i] - M; //递推C 数组 sort(C, C+n); long long x1 = C[n/2], ans = 0; //计算x1 //把x1 代入,计算转手的总金币数 for(int i = 0; i < n; i++) ans += abs(x1 - C[i]); printf("%lld\n", ans); } return 0; } 程序本身并没有太多技巧可言,但需要注意的是long long 的输入输出。在《算法竞赛 入门经典(第2 版)》中我们已经解释过了,%lld 这个占位符并不是跨平台的。比如,Windows 下的mingw 需要用%I64d 而不是%lld。虽然cin/cout 没有这个问题,但是本题输入量比较大, cin/cout 会很慢。有两个解决方案:一是自己编写输入输出函数(前面已经给过范例),二 是使用ios::sync_ with_stdio(false),通过关闭ios 和stdio 之间的同步来加速,有兴趣的读者 可以自行搜索详细信息。

作者简介

刘汝佳,2000年3月获得NOI2000全国青少年信息学奥林匹克竞赛一等奖。大一时获2001年ACM/ICPC国际大学生程序设计竞赛亚洲-上海赛区冠军和2002年世界总决赛银牌。2004年至今共为 ACM/ICPC亚洲赛区命题二十余道,担任6次裁判和2次命题总监,并应邀参加IOI和ACM/ICPC相关国际研讨会。曾出版《算法竞赛入门经典》《算法竞赛入门经典——训练指南》《编程挑战》等畅销书。 陈锋,任职于厦门宇道信隆信息科技有限公司,担任技术总监职务,专注于人工智能以及算法技术在金融科技领域的应用。同时担任四川大学ACM/ICPC算法竞赛集训队特邀指导老师,榕阳编程NOI、NOIP指导教练。所带学员多次获得ICPC金/银牌,进入NOI省队等。曾出版《算法竞赛入门经典——训练指南》《算法竞赛入门经典——习题与解答》《算法竞赛入门经典——算法实现》等畅销书。

预估到手价 ×

预估到手价是按参与促销活动、以最优惠的购买方案计算出的价格(不含优惠券部分),仅供参考,未必等同于实际到手价。

确定
快速
导航