中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折!

歡迎光臨中圖網 請 | 注冊
> >>
算法競賽入門經典訓練指南

包郵 算法競賽入門經典訓練指南

作者:劉汝佳
出版社:清華大學出版社出版時間:2021-05-01
開本: 16開 頁數: 600
中 圖 價:¥74.3(6.3折) 定價  ¥118.0 登錄后可看到會員價
加入購物車 收藏
開年大促, 全場包郵
?新疆、西藏除外
本類五星書更多>

算法競賽入門經典訓練指南 版權信息

算法競賽入門經典訓練指南 本書特色

作者授課視頻資源: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省隊等。曾出版《算法競賽入門經典——訓練指南》《算法競賽入門經典——習題與解答》《算法競賽入門經典——算法實現》等暢銷書。

商品評論(0條)
暫無評論……
書友推薦
本類暢銷
編輯推薦
返回頂部
中圖網
在線客服
主站蜘蛛池模板: 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 防水套管厂家_刚性防水套管_柔性防水套管_不锈钢防水套管-郑州中泰管道 | 深圳湾1号房价_深圳湾1号二手房源 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 网带通过式抛丸机,,网带式打砂机,吊钩式,抛丸机,中山抛丸机生产厂家,江门抛丸机,佛山吊钩式,东莞抛丸机,中山市泰达自动化设备有限公司 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 定量包装秤,吨袋包装称,伸缩溜管,全自动包装秤,码垛机器人,无锡市邦尧机械工程有限公司 | 代理记账_公司起名核名_公司注册_工商注册-睿婕实业有限公司 | 科普仪器菏泽市教育教学仪器总厂 | 恒压供水控制柜|无负压|一体化泵站控制柜|PLC远程调试|MCGS触摸屏|自动控制方案-联致自控设备 | 安徽合肥格力空调专卖店_格力中央空调_格力空调总经销公司代理-皖格制冷设备 | 纯化水设备-纯水设备-超纯水设备-[大鹏水处理]纯水设备一站式服务商-东莞市大鹏水处理科技有限公司 | 稳尚教育加盟-打造高考志愿填报平台_新高考志愿填报加盟_学业生涯规划加盟 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | CPSE安博会 | 环讯传媒,永康网络公司,永康网站建设,永康小程序开发制作,永康网站制作,武义网页设计,金华地区网站SEO优化推广 - 永康市环讯电子商务有限公司 | 杭州双螺杆挤出机-百科| 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 合肥仿石砖_合肥pc砖厂家_合肥PC仿石砖_安徽旭坤建材有限公司 | lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 永嘉县奥阳陶瓷阀门有限公司 | 机床主轴维修|刀塔维修|C轴维修-常州翔高精密机械有限公司 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | CPSE安博会| 慈溪麦田广告公司,提供慈溪广告设计。 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 导电银胶_LED封装导电银胶_半导体封装导电胶厂家-上海腾烁 | 博医通医疗器械互联网供应链服务平台_博医通 | 丝杆升降机-不锈钢丝杆升降机-非标定制丝杆升降机厂家-山东鑫光减速机有限公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 北京企业宣传片拍摄_公司宣传片制作-广告短视频制作_北京宣传片拍摄公司 | 最新电影-好看的电视剧大全-朝夕电影网 | 一体化污水处理设备,一体化污水设备厂家-宜兴市福源水处理设备有限公司 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 渗透仪-直剪仪-三轴仪|苏州昱创百科 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 |