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 樹形動態規划介紹