###### tags: `MDCPP`, `明道中學傳承` # 從零開始的競程介紹 ## 甚麼是競程? 競程就是程式競賽的簡寫,通常是比一些演算法題目的程式實作。 這是廣大資訊領域中的一小個分支而已,但對中學生來說,因為有很多專門的比賽和檢定對升學很有幫助,所以現在越來越熱門。 ## 甚麼樣的人適合競程? 競程的練習方式就是寫題目和學習新的演算法,適合喜歡思考或寫程式的人來加入。但最重要的還是看自己有沒有興趣,可以先嘗試用Online Judge解一些題目來判斷(後面會介紹甚麼是Online Judge)。 可以先參考[這部影片](https://www.youtube.com/watch?v=ueNT-w7Oluw&ab_channel=WilliamLin)的前30秒。 ## 要怎怎麼入門? 入門可能會比較辛苦一點,但只要能找一些人陪你一起練習或加入一些優質社團(~~像是MDCPP~~),一定能體會到其中的樂趣。 ### 要先學哪種語言? 首先要比程式競賽當然要會程式語言,現在最主流的是 `C++` 和 `Python`(但最通用的還是`C++`,`Python`有些比賽不能使用),**所以建議初學者先去學習** `C++`。 學習程式語言其實真的和學習一門新的語言很像,一開始會甚麼都看不懂,只能靠死記硬背,但只要撐過這段時期,程式語言也沒有想像中那麼複雜困難。而且學習完一種程式語言後,學習其他程式語言的速度也會大幅加快。 ### 學習資源 很多人可能會好奇,應不應該買書? 如果你只是要學習程式語言**語法**的話,我的回答會是**不要**。 去書店看看的話,會發現有關程式語言的書都又厚又貴。 如果你真的不信邪買了一本回家的話,大概讀不到 1 / 4,就開始拿它來蓋泡麵了(~~本人家裡就有一本QQ~~)。 這種又厚又重的書被我們稱為字典書,就真的是和字典一樣的存在,裡面雖然語法用法齊全,但還要花時間翻找,而且這些資源其實上網搜尋也能輕鬆得到,所以不建議大家買書。 要學習資源的話,上網找就能獲得很多了,這邊提供幾個比較優質的。 - [Solo Learn](https://www.sololearn.com/home) - [新竹實驗中學C++程式語言教學講義](https://hackmd.io/@CLKO/B18yT_i5Z) - [USACO Guide](https://usaco.guide/dashboard/) 第一個是專門學習程式語言的網站,而且不會一直要你付錢。 第二個是很棒的講義,後面的演算法部分也不很不錯。 第三個是美國的IOI國手做的IOI培訓專用網站,從非常簡單到非常難都有。 ## 電資圈介紹 因為下面可能會用到一些比較特殊的用語,所以先和大家做個介紹。 ### 名詞定義 **電資圈** : 泛指對資訊有興趣的中學生所組成的團體。 **電神** : 每次在比賽中都打爛你的神人,ex : ICEYLEMON。 **水題** : 泛指簡單的題目,對每個人來說可能不太一樣。 **燒雞** : 指比賽打爛,或程式打爛。 **裝弱** : 電神最愛做的事。 ### 打招呼方式 Orz ![](https://i.imgur.com/Y3un7NA.gif) 跟著做就對了,如果是電資圈的人一定會回應你的XD ### 對話範例 電神A : 我比賽又燒雞了。 電神B : 你明明就第一名,你裝弱。 電神A : 否阿你都解出我不會的題目,我超弱。 電神B : 我只會解水題阿,我更弱。 電神A : 你都把我不會的題目當水題解,你超電。 電神B : 否阿,我超弱。 電神A : 我更弱。 電神B : 我最弱。 ... ... 接著就進入無限裝弱迴圈。 ## OJ (Online Judge 系統) ### 甚麼是 Online Judge? 就是一個你可以找到題目並且上傳程式碼獲得反饋的地方,有些OJ還會提供線上比賽、題解等功能。 舉個例子,[TIOJ A+B問題](https://tioj.ck.tp.edu.tw/problems/1002)。 這是建中的OJ,上面的題目從很簡單到很難都有。 而這題就是一個很簡單的題目,點進去看後會發現他直接把程式碼給你了。 ```cpp= #include <iostream> using namespace std; int main() { int a,b; cin >> a >> b; cout << a+b << endl; return 0; } ``` 只要把這個程式碼複製並submit(提交後記得多重新整理幾次( 某匿名人士:F5非常重要) ),就會看到滿滿的綠色東西,代表你的程式碼正確(Accepted : 簡稱 AC),相信這會是你以後最喜歡看到的東西。 <a style="color:green;font-size:40px">AC</a> ![](https://i.imgur.com/8Cejh72.png) <a style="color:red;font-size:40px">WA</a> 但如果你的程式碼輸出的答案錯誤,你就會拿到紅紅的 Wrong Answer。 ![](https://i.imgur.com/2Un33sp.png) <a style="color:black;font-size:40px">CE</a> Compile error 的縮寫,代表你的程式不能被正確編譯,通常會把編譯錯誤的訊息給你看。 ![](https://i.imgur.com/kwyc51h.png) 上面這個例子就是忘記宣告變數 `a, b` <a style="color:blue;font-size:40px">TLE</a> Time limit exceed 的縮寫,代表你的程式執行太久了,可能需要改進。 ![](https://i.imgur.com/5YvpaBw.png) <a style="color:gold;font-size:40px">MLE</a> Memory limit exceed 的縮寫,代表你的程式使用了過多的記憶體。 ![](https://i.imgur.com/QEzxP6r.png) ![](https://i.imgur.com/VWYot3m.png) 在TIOJ上MLE也包括了存取記憶體不當的情況(SE或RE),但有些則會把他歸類成下面會提到的RE。 <a style="color:purple;font-size:40px">RE</a> Runtime error的縮寫,通常是陣列開太小、遞迴太深等問題,但詳細情形太多也沒辦法簡單說清楚,是個比較麻煩的錯誤訊息。 ### 小結 上面提到的OJ回饋在不同OJ上可能都會有些許不同,但大方向都是要幫助你把錯誤的程式碼改成正確的,好好看懂這些回饋,可以減少自己的debug時間。 ## 各大OJ介紹 現在好用的OJ真的非常多,但每個OJ的優點可能都不太一樣,所以這邊會介紹一些對初學者比較有用的OJ,可以大概分為基礎和進階兩類。 ### 基礎篇 並不是說基礎篇的OJ中就不會有難題出現,但裡面會有很多題目都是為新手準備的,因此適合用來打基礎。 ### [MDCPP Judge](http://mdcpp.mingdao.edu.tw/) 我們明道中學學生專用Judge,裡面有很多練習語法的題目和一些MDCPP講師自己出的有題目,也有搬運許多NPSC的考題,而且還有許多場模擬賽可以打,雖然分類有點亂,但是個只要認真找就能找到好題目的網站。 因為不開放自行註冊,想要帳號可以加入MDCPP或是去私訊MDCPP講師。 ### [Green Judge](http://www.tcgs.tc.edu.tw:1218/) 台中女中的Judge,裡面的題目非常適合初學者,尤其是基礎題庫和初級題庫,想打好基礎的同學應該把那100題都寫完。 但網頁速度偏慢,而且只支援到 `c++98`,不支援萬用標頭檔 `bits/stdc++.h`。 ### [Zero Judge](https://zerojudge.tw/) 傳說中的水題網站,裡面雖然會有一些好題但水題仍佔了絕大多數,所以對初學者來說相對友善,可以輕鬆刷題增加信心,但不建議花太多時間在Zero Judge的水題上面。 上面會有一些學科能力地區賽的題目、模板題和Uva翻譯題還是很不錯的。 ### 進階篇 這些OJ的題目普遍都會用到演算法或一些競程技巧,有些還會定期舉辦線上比 賽。 因為內容有點多,而且可能對初學者來說可能比較難以理解,所以**初學者可以先跳過**。 ### [Codeforces](https://codeforces.com/) 全英文網站,簡稱CF,幾乎每個禮拜都至少有一場比賽,難度分為div1, 2, 3(從難到簡)。 幾乎所有打競程的人都會使用的網站,打完比賽後會有 Rating(排名分數),有時候會作為一個衡量一個人實力的方式,但也不一定完全準確。 CF比賽的題目有時候偏向腦筋急轉彎或是奇怪小技巧,所以如果轉不過來的話就會打不好,建議新手不要太把Rating當回事,等有一定的實力再去想辦法提升Rating就好。 ### [Atcoder](https://atcoder.jp/home) 全英文網站,或者也可以看日文,也會有線上比賽。 現在的比賽通常都是 - ABC (Atcoder Beginner Contest) - ARC (Atcoder Regular Contest) ABC的前三題都是非常水的題目,第四題通常也不會太難,第五題通常是經典演算法或資料結構題,第六題之後就會變得相當困難。 就算新手來打也至少能解個三題,所以相對於Codeforces的比賽,我比較推薦從ABC開始打。 ARC的難度就比較浮動,但整題來說會比ABC難。 打完比賽也會排Raiting,但比較少人在意。 之前還有AGC,是比ARC還要難的比賽,現在很少出現了(出現了應該也打不了,Rating要求很高)。 ### [CSES](https://cses.fi/problemset/) 也是全英文,對提升實力非常有幫助的一個網站,每個主題都分得很清楚,題目也有按照難度排序,而且都是很經典的題目,可以配合[CP hand book](https://usaco.guide/CPH.pdf)一起使用。 ### [TIOJ](https://tioj.ck.tp.edu.tw/) 上面有介紹過,這是建中的Judge,裡面會有許多電神自己出的題目,也會有一些TOI初選、模考、還有近幾年全國賽的題目,總之是建議在有一定實力之後再去刷裡面的題目。 ## OJ使用守則 上面提到了這麼多OJ,如果能有效率的運用每個OJ,實力一定會突飛猛進。 ### 刷題 刷題也分為很多種,第一種是隨機刷題,這是在對大部分資料結構、演算法都有一定了解後會比較有用,有些OJ會用難度分類,可以選自己適合的難度然後隨機亂選,選了一題之後可以設個思考時間,超過思考時間之後如果還是完全沒想法就去看題解。 第二種是主題式刷題,就是選一個主題開始大量寫同種類的題目,這會讓你對那個主題的了解更加深刻,如果要進行主題式刷題的化可以上網找題單,或去和一些電神們要題目。 ### 補題 如果你是喜歡打線上賽的人,但每次打完之後不會去把沒打出來的題目補完,那建議你不要再花時間打線上賽了,因為你都只打你會的題目,這樣進步會非常緩慢。 所以建議大家,一場比賽如果解了3題,**至少**要去把第4題也解出來。線上賽通常都會有詳細的題解,所以不用怕寫不出來。 ### Virtual 這個詞源自於CF上的一個virtual功能,可以讓你自己選時間打一場已經結束的比賽,現在衍伸成打模擬賽的意思。 這對熟悉比賽狀況,練習臨場反應都非常有幫助,可以在各種比賽前找考古題來和朋友們一起virtual。 ## 比賽資訊 既然是程式競賽,當然會有很多比賽,每個比賽都有自己不同的特色和獎品,而且是可以和其他電神一起競爭的機會,一定要好好把握。 初學者一開始參加比賽可能都會被電得很慘,但還是要鼓勵大家多去參加,也是個認識一些其他學校的電神和他們交流的機會。 比賽介紹順去大致上是由基礎到進階。 ### APCS 嚴格來說這只是檢定,但實作題目內容和競程題目一樣,都是演算法和資料結構的題目。 實作題總共有4題,難度大致分布如下。 1. 第一題,需要會使用迴圈。 2. 第二題,需要會雙層迴圈,通常程式碼會偏長,要有一定的實作能力。 3. 第三題,會出現演算法和資料結構,想法開始變難,程式碼通常不會太長。 4. 第四題,比較有變化的題目,也一定會用到演算法或資料結構,要靠自己實力的累積和一點運氣。 還沒學算法的初學者可以挑戰先打出前兩題,學完算法之後再挑戰3, 4題。 APCS最難的地方在於,你寫完程式不會給你即時的反饋,到最後你可能會發現你的分數比預期的低,所以在寫實做題的時候一定要注意,多自己寫一些測資去測試程式碼。 對於已能夠打出APCS前兩題的同學,可以參考吳邦一教授編的[APCS實作題從三級到五級](https://drive.google.com/drive/folders/10hZCMHH0YgsfguVZCHU7EYiG8qJE5f-m),是非常好的一本講義,如果能全部看完且寫完習題,一定可以拿到五級。 ### YTP 少年圖靈計畫,精誠資訊所辦的比賽,傳說中的佛心比賽,只要通過線上初賽,就可以參加有免費的披薩、炸雞的現場決賽,名次高的隊伍還可以獲得獎金和參加製作專題的機會。 沒錯,這是團隊賽,三個人用一台電腦,和大學端的ICPC比賽賽制類似。 ### TOI 初選 這是在國高中階段打競程的人最想打好的一個比賽,因為這個比賽會選大約20位同學和學科能力競賽的前10名進行第一階段選手培訓,如果能繼續打進去第2階段,幾乎能保證可以不用考試直接上台大資工,對升學很有幫助。 但這個比賽聽起來就很難啊,怎麼會放在這麼前面講。沒錯確實是很難,但建議初學者也一定要去參加,對於**高一以下的學生**還有**女生**,會提供保障名額,要好好把握機會,進到選訓營一定會收穫非常非常多。 沒有被保障的學生也別氣餒,只要努力練習一定有機會靠自己的實力打進去。 要參加初選的條件是通過海選或有APCS 3級以上。 ### 資訊學科能力競賽 分為校內初選、地區複賽、全國決賽,全國決賽的前10名可以進TOI選訓營。 校內初選和地區複賽的題目都是各地區和學校自己出的,所以無法保證難度和題目品質,像是台北複賽就會競爭得非常激烈。 但比到了全國賽就會好很多,還可以去住飯店😍,題目也非常有趣。 ### NPSC 台大辦的比賽,題目整題偏難,大部分都是之前的IOI國手所出的題目。 也有分線上初賽和決賽,決賽的獎品真的非常棒,雖然要拿到也是非常困難。 這也是團隊比賽。 ### IOI International Olympiad in Informatics的縮寫,也就是國際資訊奧林匹亞,簡稱資奧。台灣每年只能派四個選手出去比賽,大家可以往這個目標努力看看。 ### 大型線上比賽 #### [Google Kick Start](https://codingcompetitions.withgoogle.com/kickstart) 每年有8場,每場四題,前三題可能和APCS實作前三差不多或更難,第四題難度浮動很大。 #### [Google Code Jam](https://codingcompetitions.withgoogle.com/codejam) 一年一度的大比賽,從資格賽一直到總決賽,要一場一場打,如果排名在範圍內才能晉級,時間對台灣人比較不友善,有時候賽程剛好在上課時間根本沒辦法打(請公假也許是個不錯的選擇),不然就是在半夜或凌晨,但就題目來說還是非常不錯有趣的,而且打得好的話會有T-shirt。 #### [FB Hacker Cup](https://www.facebook.com/codingcompetitions/hacker-cup/) 賽制和Code Jam差不多,也是很值得打的比賽。 ## 比賽總結 其實還有非常非常多比賽,要自己小心留意,不要錯過了報名時間才後悔,所以建議大家多去追蹤一些電神的FB帳號,或是加入一些社群,隨時關心最新的比賽資訊。 打這些比賽很多時候也不一定是想要拿個好成績,更多時候是覺得有趣,並且和他人交流的一個機會,建議大家可以先多去試試看,一開始一定會被電爛,不要覺得丟臉,每次被電爛時也同時慢慢累積自己的實力,有一天也會換你去電別人。 ## 學習資源統整 - [Solo Learn](https://www.sololearn.com/home) - [新竹實驗中學C++程式語言教學講義](https://hackmd.io/@CLKO/B18yT_i5Z) - [USACO Guide](https://usaco.guide/dashboard/) - [APCS實作題從三級到五級](https://drive.google.com/drive/folders/10hZCMHH0YgsfguVZCHU7EYiG8qJE5f-m) - [CP hand book](https://usaco.guide/CPH.pdf) - [STL 教學講義](https://tioj.ck.tp.edu.tw/uploads/attachment/5/12/1_2.pdf) 要看完上面的資源應該就會花費不少時間了,尤其是下面三個,如果真的能全部看完打進出TOI一階一定沒問題了。 下面再提供一些資源,可以配合著做使用。 #### 其他學校培訓講義 - [版中講義](https://sites.google.com/site/pcshic/zi-xun-pei-xun) - [建中講義](https://tioj.ck.tp.edu.tw/articles/5) #### 競程百科 - [OI wiki](https://oi-wiki.org/) - [CP Algorithms](https://cp-algorithms.com/) #### 電神的網站 - [wiwiho 的競程筆記](https://cp.wiwiho.me/lessons/) - [蛋餅的競程隨筆](https://omeletwithoutegg.github.io/) - [雞塊的競程隨筆](https://www.jikuai.codes/) - [iceylemon 的程式小空間](https://oosheepyerd79135.gitbook.io/iceylemon_cp/) - [Sshwy's Notes](https://notes.sshwy.name/) 最後一個是大陸的神人,但大陸神人的blog真的太多了,而且有些真的很可怕,建議大家小心使用。