How to Practice
再踏入競程的世界前,你會需要具備基礎的程式能力,但不需要多高深的程式設計技巧。使用陣列、迴圈、函數、遞迴、指標、結構等等基礎語法即可實作幾乎所有題目的解答。
你如果先前修過演算法或資料結構的相關課程,例如計算方法設計,在學習經典演算法的部分會輕鬆許多。但課堂中強調的會是理論證明與分析,與實際解題不太相同。
新手
此階段的目標是讓你能夠入門競程,學習解題會使用到的基礎技巧與經典算法。建議根據新手導向的教材一步一步走,同時搭配刷題培養解題的速度。
系統性學習
- 書籍或線上資源
- Competitive Programmer's Handbook
- 推,可以搭配 CSES Problem Set。
- USACO Guide
- 美國資奧選手整理的網站,可以從 0 開始入門,且每一主題都有附上很多各大 OJ 的例題。
- 培養與鍛鍊程式設計的邏輯腦:世界級程式設計大賽的知識、心得與解題分享
- 大家都稱之為腦書,還不錯,但是習題的 OJ 已經不是近年來大家常用的 OJ。
- AP325- 從 APCS 實作題檢測三級到五級
- 雖然受眾是高中生的 APCS 考試,但是是個中文資料能讓你快速入門競程的基礎知識與技巧。
- Competitive Programmer's Handbook
- 修清大競技程式設計(一)
- 歡迎大家來補充!
刷題
一般來說,競程練習的平台有兩種,一種是會舉辦線上比賽,例如:Codeforces、Atcoder。另一種則是純粹的線上解題平台。此一階段不建議你隨便找 OJ 戳題目來做。除了你系統性學習會練習到的題目以外,會比較建議參考練習題單或是參加簡單的比賽。
- CSES Problem Set
- 推,對於每個主題都有簡單、經典的題目可以練習。
- Codeforces (Div.3) Round
- Codeforces 平台上最簡單的比賽。
- Atcoder Beginner Contest
- 推,固定每週六晚上 20:00 比賽。一場大概會有七到八題。只是後面幾題的難度可能對新手來說會太難,可以先略過。
- 歡迎大家來補充!
進階
在入門競程,學完了基本技巧、經典算法後,學習模式通常會變得比較像是遇到什麼技巧或知識才去學,而不是跟著別人排定好的教材去學習。以下附上一些學習資源與推薦比賽。
學習
- Algorithms for Competitive Programming
- 筆者自己很喜歡這個網站,統整了很多知識與資料,但個人覺得這裡面的內容入門就直接去讀會有點困難。
- Codeforces Blog
- 許多人會在 Codeforces Blog 上撰寫教學文章,推推。
- 這種資料沒有讀完的一天,你可以看到有趣的就先存起來,沒事就拿來讀。
- https://codeforces.com/blog/entry/91363
- OI Wiki、IOI 中國國家候選隊論文、和各種中國文章
- OI Wiki 中的文章品質很不穩定,有一些甚至是其他網站的英翻中,但是確實包含了很多技巧與滿多滿難的內容(難到不是很實用)
- 筆者自己的心得是,很多中國流傳的技巧,其實都只是一些簡單的技巧的組合(甚至還看過有文章宣稱自己創造了一個新算法並希望以後大家能用某某名字稱呼該算法,結果直接被評論打臉)。大家不要被聽起來很炫炮的名字嚇到。
- Competitive Programming 4
- 聽說不錯,但我自己沒看過
- 參與營隊
- 歡迎大家來補充!
刷題
- Atcoder Beginner Contest
- 沒錯!又是 ABC!這一系列的題目都很讚,推薦大家每題都做。
- Atcoder Regular/Grand Contest
- 題目難度以這種線上平台的比賽來說算高,但是題目品質都很不錯。
- Educational Codeforces Round
- CS Academy
- 題目品質都很不錯
- Codeforces (Div.1)/(Div.2) Round
- 事實上近年的 Codeforces Regular Round 的出題導向已經有點偏離 ICPC 會考的題型與知識點。
- 可以去找幾年前的 Codeforce Round 的題目來練習。
- 但是這些比賽能升 Rating 以及練練頭腦,所以還是讚。
- 歡迎大家來補充!
Training for Group Contest
一般來說,一個隊伍在比賽前會頻繁的團練,至於團練內容主要都是模擬一場 5 小時的團體比賽。你可以到 Codeforces Gym 上找到一些 ICPC Regional 或是相關類型的比賽。透過 Virtual Participation 你也可以即時模擬整個比賽的排行榜,與世界各地有打/模擬這場比賽的人競爭。你也可以去狙擊其他學校的隊伍,從提交紀錄稽查他們團練了哪一場,自己偷偷也跟著練,看看實力差距在哪邊。
要不要印紙本題目、是不是只有一個人能寫 Code、Coding 環境需不需要開賽才能調整、Codebook 上的 Code 能不能直接複製等等全看當事者想要多擬真來決定。這麼做比起每個人獨立刷題,能磨合彼此之間合作的默契,熟悉比賽情境等等。
一般來說在準備比賽期間,至少一個禮拜要模擬一場,如果時間允許的話兩場更好。不過模擬一次比賽加上事後補題真的很花時間。主要的實力成長還是得靠各自平時的練習。
提供一個數據給大家參考。某隊在 ICPC 台北站獲得第一名的隊伍,從暑假開始到 ICPC 台灣區域站前總共模擬了 51 場比賽。
Training for ICPC WF
- QOJ
- 除了 Codeforces Gym 以外也可以在這上面找 ICPC Regional 或者是相關比賽來練習
- Petrozavodsk Programming Camp
- The level of contests: for participants of the semi-finals and finals of the ICPC World Championship
- https://qoj.ac/category/5
- https://codeforces.com/blog/entry/84489
練好計算幾何,ICPC WF 特愛出幾何題目。- 歡迎大家補充!
Note
- 很多人一直在追求學習很多炫砲名稱的演算法與技巧,然而多數比賽出的題目其實都是基礎演算法的變形與延伸。
- 訓練是需要長期累積的,不能妄想自己經過一學期的訓練就能出人頭地。一個不負責任的觀察是,假如大一從零開始不間斷的培養,大概大三或大四才能在 ICPC 區域賽上有一定競爭力。
- 強烈建議不要自己埋頭苦練,去找人一起練習刷題,能夠讓自己更有動力,也能一起討論題目。如果真的沒有朋友,直接在 DC 群組上和大將討論題目也是可行的做法。
- 自己解出題目後一定要去參考一下網路上別人的解法,學習不同的思考方式,甚至是學習別人的程式語法或怎麼寫的。
- 每個人的學習步調不同,自己拿捏要花多久想題目才去看題解。
以下是一位大學才開始接觸競程的清大學長的經驗分享影片,推薦觀看!
Other Resources
以上的內容只是所有資源中的冰山一角而已,大家可以自己在網路上搜尋到更多新手引導或相關資料。以下隨意附上幾點,歡迎各位補充!