ACM-ICPC 培训资料汇编
( 3)
数据结构、动态规划分册
(版本号 1.0.0)
哈尔滨理工大学 ACM-ICPC 集训队
2012 年 12 月
哈尔滨理工大学 ACM-ICPC 培训资料汇编
- I -
序
2012 年 5 月,哈尔滨理工大学承办了 ACM-ICPC 黑龙江省第七届大学生程序设计竞
赛。做为本次竞赛的主要组织者,我还是很在意本校学生是否能在此次竞赛中取得较好成
绩,毕竟这也是学校的脸面。因此,当 2011 年 10 月确定学校承办本届竞赛后,我就给齐
达拉图同学很大压力,希望他能认真训练参赛学生,严格要求受训队员。当然,齐达拉图
同学半年多的工作还是很有成效,不仅带着黄李龙、姜喜鹏、程宪庆、卢俊达等队员开发
了我校的 OJ 主站和竞赛现场版 OJ,还集体带出了几个比较像样的新队员,使得今年省赛
我校取得了很好的成绩(当然,也承蒙哈工大和哈工程关照,没有派出全部大牛来参
赛)。
在 2011 年 9 月之前,我对 ACM-ICPC 关心甚少。但是,我注意到我校队员学习、训练
没有统一的资料,也没有按照竞赛所需知识体系全面系统培训新队员。 2011-2012 年度的
学生教练们做了一个较详细的培训计划,每周都会给 2011 级新队员上课,也会对老队员
进行训练,辛辛苦苦忙活了一年——但是这些知识是根据他们个人所掌握情况来给新生讲
解的,新生也是杂七杂八看些资料和做题。在培训的规范性上欠缺很多,当然这个责任不
在学生教练。 2011 年 9 月,我曾给老队员提出编写培训资料这个任务,一是老队员人数
少,有的还要去百度等企业实习;二是老队员要开发、改造 OJ;三是培训新队员也很耗费
精力,因此这项工作虽很重要,但却不是那时最迫切的事情,只好被搁置下来。
2012 年 8 月底, 2012 级新生满怀梦想和憧憬来到学校,部分同学也被 ACM-ICPC 深深
吸引。面对这个新群体的培训,如何提高效率和质量这个老问题又浮现出来。市面现在已
经有了各种各样的 ACM-ICPC 培训教材,主要算法和解题思路都有了广泛深入的分析和讨
论。同时,互联网博客、 BBS 等中也隐藏着诸多大牛对某些算法的精彩论述和参赛感悟。
我想,做一个资料汇编,采撷各家言论之精要,对新生学习应该会有较大帮助,至少一可
以减少他们上网盲目搜索的时间,二可以给他们构造一个相对完整的知识体系。
感谢 ACM-ICPC 先辈们作出的杰出工作和贡献,使得我们这些后继者们可以站在巨人
的肩膀上前行。
感谢校集训队各位队员的无私、真诚和抱负的崇高使命感、责任感,能够任劳任怨、
以苦为乐的做好这件我校的开创性工作。
唐远新
2012 年 10 月
哈尔滨理工大学 ACM-ICPC 培训资料汇编
- II -
编写说明
本资料为哈尔滨理工大学 ACM-ICPC 集训队自编自用的内部资料,不作为商业销售目
的,也不用于商业培训,因此请各参与学习的同学不要外传。
本分册大纲由黄李龙编写,内容由黄李龙、周洲、卢俊达、曹振海等分别编写和校
核。
本分册内容大部分采编自各 OJ、互联网和部分书籍。在此,对所有引用文献和试题的
原作者表示诚挚的谢意!
由于时间仓促,本资料难免存在表述不当和错误之处,格式也不是很规范,请各位同
学对发现的错误或不当之处向acm@hrbust.edu.cn邮箱反馈,以便尽快完善本文档。在此对
各位同学的积极参与表示感谢!
哈尔滨理工大学在线评测系统( Hrbust-OJ)网址: http://acm.hrbust.edu.cn,欢迎各位
同学积极参与AC。
国内部分知名 OJ:
杭州电子科技大学: http://acm.hdu.edu.cn
北京大学: http://poj.org
浙江大学: http://acm.zju.edu.cn
以下百度空间列出了比较全的国内外知名 OJ:
http://hi.baidu.com/leo_xxx/item/6719a5ffe25755713c198b50
哈尔滨理工大学 ACM-ICPC 集训队
2012 年 12 月
哈尔滨理工大学 ACM-ICPC 培训资料汇编
- III -
目 录
序…….......................................................................................................................................... I
编写说明..................................................................................................................................... II
第 1 章 数据结构........................................................................................................................5
1.1 散列...................................................................................................................................5
1.1.1 散列表的概念............................................................................................................5
1.1.2 散列函数的构造方法................................................................................................6
1.1.3 处理冲突的方法........................................................................................................7
1.1.4 散列表上的运算......................................................................................................11
1.1.5 散列表的应用..........................................................................................................14
1.1.6 附:字符串哈希函数..............................................................................................18
1.2 并查集.............................................................................................................................19
1.2.1 并查集基本原理......................................................................................................19
1.2.2 并查集的时间复杂度分析和优化..........................................................................21
1.2.3 并查集样例代码......................................................................................................22
1.2.4 例题讲解..................................................................................................................22
1.3 二叉堆.............................................................................................................................27
1.3.1 二叉堆的概念..........................................................................................................28
1.3.2 二叉堆的基本操作..................................................................................................28
1.3.3 堆排序......................................................................................................................30
1.3.4 经典题目..................................................................................................................30
1.4 树状数组.........................................................................................................................36
1.4.1 基本原理..................................................................................................................36
1.4.2 树状数组例题..........................................................................................................39
1.4.3 其他推荐例题..........................................................................................................44
1.5 线段树.............................................................................................................................44
1.1.1 线段树的介绍..........................................................................................................45
1.1.2 线段树模板代码......................................................................................................45
1.1.3 经典题目..................................................................................................................46
1.6 随机平衡二叉查找树.....................................................................................................53
1.6.1 概述..........................................................................................................................54
1.6.2 Treap基本操作..........................................................................................................54
1.6.3 Treap的操作..............................................................................................................54
1.7 Treap应用.........................................................................................................................57
1.8 总结.................................................................................................................................57
1.8.1 经典题目..................................................................................................................57
1.8.2 其他例题..................................................................................................................66
1.9 伸展树(Splay Tree).........................................................................................................66
1.9.1 概述..........................................................................................................................67
1.9.2 基本操作..................................................................................................................67
1.9.3 在伸展树中对区间进行操作..................................................................................69
1.9.4 实例分析—NOI 2005 维护数列( Sequence) ....................................................71
1.9.5 和线段树的比较......................................................................................................76
哈尔滨理工大学 ACM-ICPC 培训资料汇编
- IV -
1.9.6 伸展树例题..............................................................................................................76
第 2 章 动态规划......................................................................................................................86
2.1 递推.................................................................................................................................86
2.1.1 递推原理..................................................................................................................86
2.1.2 一般的思路..............................................................................................................86
2.1.3 经典题目..................................................................................................................86
2.2 背包问题.........................................................................................................................87
2.2.1 背包的入门和进阶..................................................................................................88
2.2.2 经典题目..................................................................................................................92
2.3 区间动态规划.................................................................................................................95
2.3.1 引子..........................................................................................................................95
2.3.2 NOIp2000 乘积最大................................................................................................95
2.3.3 POJ 1141 Brackets Sequence....................................................................................97
2.3.4 NOIp2006 能量项链................................................................................................99
2.3.5 NOI 2001 棋盘分割...............................................................................................101
2.3.6 其他题目................................................................................................................104
2.4 状态压缩动态规划.......................................................................................................104
2.4.1 状态压缩的原理....................................................................................................104
2.4.2 一般的解题思路....................................................................................................105
2.4.3 经典题目................................................................................................................105
2.4.4 扩展变型................................................................................................................ 111
2.5 树形动态规划............................................................................................................... 111
2.5.1 树形动态规划介绍