acm國際大學生程序設計競賽(acm-icpc)是國際上公認的水平最高、規(guī)模最大、影響最深的計算機專業(yè)競賽,目前全球參與人數(shù)達20多萬!禔CM國際大學生程序設計競賽:知識與入門》作者將16年的教練經(jīng)驗與積累撰寫成本系列叢書,全面、深入而系統(tǒng)地將acm-icpc展現(xiàn)給讀者。本系列叢書包括《acm國際大學生程序設計競賽:知識與入門》、《acm國際大學生程序設計競賽:算法與實現(xiàn)》、《acm國際大學生程序設計競賽:題目與解讀》、《acm國際大學生程序設計競賽:比賽與思考》等4冊,其中《acm國際大學生程序設計競賽:知識與入門》介紹了acm-icpc的知識及其分類、進階與角色、在線評測系統(tǒng);《acm國際大學生程序設計競賽:算法與實現(xiàn)》介紹了acm-icpc算法分類、實現(xiàn)及索引;《acm國際大學生程序設計競賽:題目與解讀》為各類算法配備經(jīng)典例題及題庫,并提供解題思路;《acm國際大學生程序設計競賽:比賽與思考》介紹了上海交通大學acm-icpc的訓練及比賽,包括訓練札記、賽場風云、賽季縱橫、冠軍之路、崢嶸歲月。
《ACM國際大學生程序設計競賽:知識與入門》適用于參加acm國際大學生程序設計競賽的本科生和研究生,對參加青少年信息學奧林匹克競賽的中學生也很有指導價值。同時,作為程序設計、數(shù)據(jù)結構、算法等相關課程的拓展與提升,本叢書也是難得的教學輔助讀物。
寫在最前面的話
自從上海交通大學2002年第一次、2005年第二次獲得ACM國際大學生程序設計競賽(ACM International Collegiate Programming Contest,簡稱ACM-ICPC或ICPC)世界冠軍以來,總有記者邀請編者撰寫冠軍之路類的文章,也總有出版社希望編者出版ACM-ICPC競賽類的書籍,因為沒有想清楚怎么寫,所以一直沒動筆。直到2010年上海交通大學第三次獲得ACM-ICPC世界冠軍后,編者決定出版一套系列叢書,包括《ACM國際大學生程序設計競賽:知識與入門》、《ACM國際大學生程序設計競賽:算法與實現(xiàn)》、《ACM國際大學生程序設計競賽:題目與解讀》及《ACM國際大學生程序設計競賽:比賽與思考》4冊書籍,全面、深入而系統(tǒng)地將ACM-ICPC展現(xiàn)給讀者,把上海交通大學十多年來對ACM-ICPC競賽的感悟分享給讀者。
編寫此系列叢書的另一個重要原因是ACM-ICPC競賽在中國大陸的迅猛發(fā)展。自從1996年ACM-ICPC引入中國大陸,前六屆僅設立1個賽區(qū),目前每年一般設立5個賽區(qū),并已有30所高校承辦過亞洲區(qū)預賽;參賽學校從不滿20所,到如今已達200多所;參賽人數(shù)從不到100人,到如今已超過12萬人次;總決賽名額從起初的3個,到如今已超過15個。同時,中國大陸在ACM-ICPC競賽上所取得的成績也舉世矚目。清華大學9次獲得總決賽獎牌(3金5銀1銅),位居獎牌榜之首,是實力最強、表現(xiàn)最穩(wěn)定的高校;上海交通大學8次獲得總決賽獎牌(4金3銀1銅),3次奪得世界冠軍,算是目前國內(nèi)成績最好的高校;中山大學4次獲得總決賽獎牌(2銀2銅),在生源不占優(yōu)勢的情況下,這一成績令人敬佩;復旦大學3次獲得總決賽獎牌(1銀2銅),是公認的強校;浙江大學2次獲得總決賽獎牌(1金1銀),1次奪得世界冠軍,再次讓國人歡欣鼓舞;北京大學1次獲得總決賽獎牌(1銅),隊員的綜合實力堪稱一流;最難能可貴的是,華南理工大學也獲得過總決賽的獎牌(1銅),它告訴我們,ACM-ICPC不僅僅是“強校”之間的“對話”,只要堅持參與就會斬獲成果。另外,至今已有37所大陸高校參加過全球總決賽,且不論成績?nèi)绾危麄冊谫悎錾系膴^斗亦值得稱道。
本系列叢書的第一冊《ACM國際大學生程序設計競賽:知識與入門》分為三個部分。知識點部分基本涵蓋了競賽中所涉及的主要知識點,包括數(shù)學基礎、數(shù)據(jù)結構、圖論、計算幾何、論題選編、求解策略等六個大類內(nèi)容。入門與進階部分介紹了包括如何快速入門、如何提高自身以及團隊水平等,主要根據(jù)上海交通大學ACM-ICPC隊多年參賽經(jīng)驗總結而來。在線資源部分對一些常用的在線評測系統(tǒng)和網(wǎng)上比賽進行了介紹。
本系列叢書的第二冊《ACM國際大學生程序設計競賽:算法與實現(xiàn)》涵蓋了大部分ACM-ICPC競賽常用的經(jīng)典算法,包括數(shù)學、圖論、數(shù)據(jù)結構、計算幾何、論題選編五個大類,對每個算法的代碼實現(xiàn),都配有接口說明以及簡略的算法闡述,并提供算法的完整程序。并收集了一些實用的知識點及積分表,方便讀者查找使用。
本系列叢書的第三冊《ACM國際大學生程序設計競賽:題目與解讀》分為兩個部分。例題精講部分針對第二冊《ACM國際大學生程序設計競賽:算法與實現(xiàn)》中的算法配備經(jīng)典例題,并提供細致的解題思路,讀者可以通過這一部分學習和掌握算法;海量題庫部分按照算法分類羅列出大量習題,并提供相應的題解,讀者可以利用這一部分的題目進行訓練,更加熟練地運用各類算法。
本系列叢書的第四冊《ACM國際大學生程序設計競賽:比賽與思考》從120多名隊員、2400余篇文檔中精心挑選、編纂而成的文集,包括訓練札記、賽場風云、賽季縱橫、冠軍之路、崢嶸歲月,集中展現(xiàn)了上海交通大學ACM-ICPC隊16年的奮斗歷程,記載了這些隊員為了實現(xiàn)自己的夢想而不懈努力、勇于拼搏的故事。
這是一套全面、系統(tǒng)地學習ACM-ICPC競賽的知識類書籍;
這是一套詳盡、深入地熟悉ACM-ICPC競賽的算法及題目的手冊類書籍;
這是一套程序設計、數(shù)據(jù)結構、算法等相關課程的拓展與提升類書籍;
這是一部上海交通大學ACM-ICPC隊的成長史;
這是一部激勵更多學子勇敢追尋并實現(xiàn)自己最初夢想的勵志書。
歷時2年零5個月,終于完成了本系列叢書,編者與隊員有一種如釋重負的感覺,因為我們把出版這套叢書看得很重,這是我們16年的經(jīng)驗與積累,希望對廣大讀者有用。
值此ACM-ICPC進入中國大陸16周年、上海交通大學獲得ACM-ICPC世界冠軍10周年之際,謹以此系列叢書——
紀念我們曾經(jīng)走過的路、度過的歲月;
獻給所有支持、幫助過我們的人……
俞 勇
2012年10月于上海
前 言
ACM國際大學生程序設計競賽(ACM International Collegiate Programming Contest,簡稱ACM-ICPC或ICPC)的試題覆蓋了計算機科學以及相關數(shù)學領域眾多知識點。這些知識通常會散落在各種書籍和論文之中,學習和查找起來相對麻煩。此外,競賽中所考察的內(nèi)容具有一定的特殊性,即使是像由Thomas H. Cormen等編著的Introduction to Algorithms這樣的經(jīng)典書籍,其中介紹的東西也并非都是競賽中的考察點。因此能夠有一本書針對ACM-ICPC競賽所經(jīng)?疾斓闹R點進行統(tǒng)一的介紹是有必要的。
本書分為三個部分,第一部分為入門與進階,第二部分為知識點與求解策略,第三部分為在線資源。第一部分介紹的內(nèi)容包括如何快速入門、如何提高自身以及團隊水平等,主要是編者根據(jù)多年的參賽經(jīng)驗總結而來。第二部分基本涵蓋了競賽中所涉及的主要知識點,包括數(shù)學基礎、數(shù)據(jù)結構、圖論、計算幾何、論題選編、求解策略等6個大類。第三部分對一些常用的在線評測系統(tǒng)和網(wǎng)上比賽進行了介紹。其中,第一部分和第三部分主要針對初學者。
由于ACM-ICPC競賽涉及到的知識點較多,很難在有限的篇幅里做到完全的覆蓋,編者主要根據(jù)重要性和實用性對內(nèi)容進行了篩選。例如,在介紹平衡二叉樹時,一般的數(shù)據(jù)結構書籍往往會介紹AVL樹或是紅黑樹,但本書只介紹了理解和實現(xiàn)起來更為簡單的伸展樹和Treap。
本書知識點部分的內(nèi)容采用的是一種類似百科全書的組織方式,所以并不需要一章一章地從前往后閱讀。讀者完全可以選擇一個自己感興趣的知識點進行閱讀,并擴展延伸到與之相關的其他知識點中。
本書編寫工作歷時兩年多,參與編寫工作的人員全部為上海交通大學ACM-ICPC隊的現(xiàn)役與退役隊員。他們參考了大量的書籍,并結合了多年的競賽經(jīng)驗,對本書的內(nèi)容進行選擇、撰寫和修改。
參與本書寫稿、審稿的人員主要有(按姓氏筆畫為序):烏辰洋、吳卓杰、張培超、陳彬毅、林承宇、易茜、鄭曌、姜嘯、曹正、曹雪智、商靜波、彭上夫、程宇、譚天。
在此,衷心感謝所有為此書出版做出直接或間接貢獻的人!也真心祝愿此書能夠給更多讀者帶來學習知識的快樂!
由于時間倉促,作者水平有限,疏漏、不當和不足之處在所難免,真誠地希望專家和讀者朋友們不吝賜教。如果您在閱讀和使用此書過程中發(fā)現(xiàn)任何問題或有任何建議,懇請發(fā)郵件,我們將不勝感激。
編 者
2012年10月于上海
第一部分 入門與進階
第1章 入門
1.1 acm-icpc競賽介紹
1.2 新手入門
1.3 團隊的分工與配合
1.4 訓練
1.5 備戰(zhàn)分區(qū)賽
1.6 備戰(zhàn)總決賽
第2章 進階
2.1 如何提高讀題能力
2.2 如何提高代碼能力
2.3 bug與debug
2.4 從做題者到命題者
第二部分 知識點與求解策略
第3章 數(shù)學基礎
3.1 函數(shù)增長與復雜性分類
3.1.1 漸進符號
3.1.2 階的計算
3.1.3 復雜性分類
.3.2 概率論
3.2.1 事件與概率
3.2.2 期望與方差
3.3 代數(shù)學
3.3.1 矩陣
3.3.2 行列式
3.3.3 解線性方程組
3.3.4 多項式
3.3.5 復數(shù)
3.3.6 群
3.4 組合學
3.4.1 排列與組合
3.4.2 鴿巢原理
3.4.3 容斥原理
3.4.4 特殊計數(shù)序列
3.4.5 pólya計數(shù)定理
3.5 博弈論
3.5.1 博弈樹
3.5.2 sg函數(shù)
3.5.3 nim游戲與nim和
3.6 數(shù)論
3.6.1 整除
3.6.2 不定方程
3.6.3 同余方程與歐拉定理
3.6.4 原根、離散對數(shù)和二項同余方程
3.6.5 連分數(shù)
第4章 數(shù)據(jù)結構
4.1 線性表
4.1.1 鏈表
4.1.2 棧
4.1.3 隊列
4.1.4 塊狀鏈表
4.2 集合
4.2.1 散列表
4.2.2 并查集
4.3 排序
4.3.1 樸素排序算法
4.3.1.1 插入排序
4.3.1.2 冒泡排序
4.3.2 高效排序算法
4.3.2.1 歸并排序算法
4.3.2.2 快速排序算法
4.3.2.3 線性排序算法
4.4 樹
4.4.1 堆
4.4.1.1 二叉堆
4.4.1.2 左偏樹
4.4.2 二叉樹
4.4.2.1 二叉搜索樹
4.4.2.2 treap
4.4.2.3 伸展樹
4.4.3 線段樹
第5章 圖論
5.1 圖
5.1.1 基本概念
5.1.1.1 圖的定義與基本術語
5.1.1.2 匹配與覆蓋
5.1.1.3 獨立集、團與支配集
5.1.1.4 圖的染色
5.1.2 特殊圖的分類
5.1.3 圖的遍歷
5.1.3.1 深度優(yōu)先遍歷
5.1.3.2 廣度優(yōu)先遍歷
5.1.4 連通性
5.1.4.1 連通性的基本定義
5.1.4.2 割點與橋
5.1.4.3 強連通分量
5.1.4.4 應用:2-sat
5.1.5 哈密頓路與歐拉路
5.1.5.1 哈密頓路
5.1.5.2 歐拉路
5.1.6 最短路
5.1.6.1 bellman-ford算法
5.1.6.2 dijkstra算法
5.1.6.3 floyd算法
5.2 樹
5.2.1 基本概念與遍歷
5.2.1.1 樹的基本定義與術語
5.2.1.2 樹的遍歷
5.2.2 生成樹
5.2.2.1 生成樹的基本概念
5.2.2.2 prim算法
5.2.2.3 kruskal算法
5.2.2.4 最小生成樹的變種
5.2.2.5 生成樹計數(shù)
5.3 二分圖
5.3.1 最大匹配
5.3.2 最大權匹配
5.3.3 穩(wěn)定婚姻
5.4 網(wǎng)絡流
5.4.1 基本概念
5.4.1.1 流網(wǎng)絡
5.4.1.2 殘量網(wǎng)絡
5.4.1.3 增廣路徑
5.4.1.4 最大流最小割定理
5.4.2 最大流算法
5.4.2.1 ford-fulkerson算法
5.4.2.2 dinic算法
5.4.3 費用流
5.4.4 流與割模型
5.4.4.1 上下界網(wǎng)絡流
5.4.4.2 混合圖歐拉回路
5.4.4.3 最大權閉合子圖
第6章 計算幾何
6.1 向量
6.2 點的有序化
6.3 多邊形與圓
6.3.1 簡單多邊形
6.3.2 凸包問題
6.3.3 圓的面積并
6.4 半平面交
6.5 經(jīng)典問題
6.5.1 線段求交
6.5.2 最近點對
6.5.3 最遠點對
第7章 論題選編
7.1 背包問題
7.2 lca與rmq
7.3 快速傅里葉變換
7.4 字符串
7.4.1 字符串匹配
7.4.2 trie
7.4.3 ac自動機
7.4.4 后綴數(shù)組
7.4.5 擴展kmp
第8章 求解策略
8.1 搜索
8.2 分治
8.3 貪心
8.4 動態(tài)規(guī)劃
8.5 隨機化
第三部分 在 線 資 源
第9章 在線評測系統(tǒng)
9.1 基本使用方法
9.2 usaco介紹
9.3 cii介紹
9.4 pku介紹
9.5 sgu介紹
9.6 spoj介紹
第10章 網(wǎng)上比賽
10.1 gcj介紹
10.2 topcoder介紹
10.3 codeforces介紹
參考文獻