2020年12月20日,南京區域賽結束,同時結束的,還有我的兩年多的ACM生涯
接下來的寒假重心會向著找實習的方向努力,當然明年還有線下的區域賽、EC-finial以及明年的省賽等等,我都會去認真準備,
這篇文章會寫什么
- 關于我
- 我的ACM簡單的回顧
- 我的ACM成績
- 寫給新人
- ACM到底和數學建模、挑戰杯等等的其他競賽有什么區別
- ACM到底帶給我什么了
- 為什么要打ACM
- 什么樣的人適合去打ACM,什么樣的人不適合去打ACM
- 寫給已經進入了ACM的人
- 我在ACM的訓練計劃
- 除了ACM之外的計劃
- 關于ACM寫題
- ACM演算法的學習規劃
- 我的一些經驗之談
這篇文章更多的是想來自我總結一下歷史,如果與你的理解有出入也請見諒
關于我
我的ACM簡單的回顧
進入大學之前
我是2018年進入的大學,在這之前,我壓根沒有聽說過ACM,也完全不知道這類競賽,高中也是沒有打過OI,也就是真正的純粹的小白,當然,我的高中壓根就不知道有什么叫OI的比賽,可能這就是所謂的省B類學校吧
但是我有優勢,我從高一開始自學了程式,我當時想自己寫游戲,然后學起來Unity了,也就順便學了C#,至于優勢,大概就是對程式有了自己的理解吧,如果讓我對代碼理解這個事情上進行一個分級的話,我會這樣分:
- 完全不會程式(基本上就是那些完全沒有學過代碼的人)
- 學會了順序、選擇、回圈陳述句(一般是剛剛開始學程式的人,對程式是萬能的這條表示懷疑的人)
- 能夠靈活的運用上述三種陳述句(突然發現僅使用這三種陳述句居然可以實作一切邏輯,相信代碼是萬能的,只是需要寫代碼的,通常這類人同樣相信代碼是高效的,認為所有的事情基本上都可以在電腦上花費一小段的時間就能得出結果)
- 知道了代碼是非常局限的,計算機能計算的速度是非常有限的,在解決一個問題前會思考這個問題的邏輯,對這個問題進行優化以適合計算機去運行,這類人也就是一個ACMer的入門點
而那時候的我,大概就是第三類的人,比起同時期的同學,只能說我擁有著非常好的起點
但是,實際上,通過一個學期的學習,基本上所有的學生都能到達這個水平
大一
大學的第一個學期,課程安排是學C語言,但是我其實并不需要,因為這些東西只需要我把我學C#的知識轉成C就行了
而這個學期,校集訓隊也聯系上了我,只不過因為我有提前的知識了,雖然我在那個時候還完全不知道對于代碼還有第四層理解
當然,慢慢的我也接觸到了很多演算法,例如dfs、bfs之類的,只能說我在那個時候對ACM的理解還存在于ACM是提供更多的解決問題的辦法而已
后來,學到了在ACM中最重要的東西:復雜度
也慢慢的開始學習到各種基礎的演算法:gcd、最短路、背包問題、KMP等等之類的
后來,我在大一快結束的時候,和另外兩位大一參加了西安邀請賽,然后成功打鐵……
緊接著是校賽,但是那次校賽的難度太高,導致全場只有20個人過題,我有幸過了兩題,但是我和之前組隊的兩個大一的同學分開了隊伍,
然后是浙江省省賽,和兩個大二的人組隊,然后繼續打鐵
再接下來是南昌邀請賽,我終于拿到了人生以來的第一個獎牌:銅
然后就是整整一個暑假的集訓,杭電的多校、牛客的多校,題目的難度對于當時我而言,未免是過高了一些,那兩個月,可謂是絕對的自閉
大二
大二開始,大概是因為經歷了暑假的自閉式訓練,拿下了一個ICPC的區域賽銀牌,雖然是銀川偷雞,但基本上是我一個人完成的比賽,而且其實本來很有希望沖擊金牌
大二下半學期,因為疫情的原因,荒廢了很久,沒有出去打比賽,只能說是不斷的學習吧,
也趁著疫情,順便把CodeForces上把我的兩個賬號都刷到了紫名
當然,因為寫的題多了,代碼寫的多了,感覺自己寫題目的習慣開始發生了改變,特別是經常打CodeForces后,感覺自己對很多思維的理解在不斷的加深,大一選擇了圖論方向,大二開始學資料結構,然后再學了字串,稍微了解了dp,隊內也把構造題的任務分配給了我
大三
這個學期難得有了好多場比賽,而我們原來參加了西安邀請賽的三個人,我們重新組成了完整的隊伍,也奪下了省賽銀牌、CCPC威海銅牌、ICPC南京銀牌這樣三個牌,
我的ACM成績
到目前為止,總共拿下了兩個ICPC區域賽銀牌,一個CCPC的銅牌,一個浙江省省賽銀牌,一個ICPC邀請賽銅牌,Codeforces兩個賬號都是紫名,準備寒假沖擊橙名,接下來會參加一場線下的ICPC比賽以及EC-finial,未來可能在能夠拿到offer的情況下,繼續回來參加ACM競賽
寫給新人
ACM到底和數學建模、挑戰杯等等的其他競賽有什么區別
如果你是計算機學院的,那么你需要追求的、考慮的唯一的競賽就是ACM
ACM是一個非常全面的競賽,如果你說你只是喜歡數學,那么ACM比數學建模之類的數學競賽更加具有挑戰性,同樣,難度更高,對的,在我的認知中,ACM對數學的要求甚至遠遠高于數學競賽,因為ACM和其他比賽不一樣的一點,便是ACM不設定任何的知識點上界,越新的知識點,越高級的知識點,ACM都可以考,甚至任何一道數學競賽的題,如果你在ACM中見到,都是合情合理的,在打ACM的時候,這個知識點不會的情況是很正常的,是所有參加了ACM競賽的人可以深切感受到的,而如果你只是去打數學之類的競賽,如果你不能到達一個很高的層次,你可能很難體會到那種,自己完全不會,完全是毫無能力的那種絕望感,而在ACM,你可以在任何一場比賽中見到,甚至是隨便在點開的一場比賽,
其次,ACM是一個非常公平、公正同時也是非常嚴格、殘酷的比賽,甚至因為它的機制,你可以認為它是你整個大學生涯中見到過,最公平,也是唯一一個能夠讓參賽選手心服口服的比賽,因為ACM幾乎不存在任何的主觀因素,你只有準確完整的解決這個問題,你才能拿到那么一點成績分,而且ACM系列競賽結束,如果這場比賽有任何一道題有一些問題,通常出題人都會出面道歉,這也是我第一次知道,原來負責出題的人也是要道歉的,從那樣的高考制度過來,我們甚至都不會去關心出題人是誰,即使他出了岔子,也會有專門的公關來解決,ACM卻沒有這些無聊的內容,
數學建模也好,挑戰杯也罷,評委老師評分制意味著主觀可以勝過客觀,甚至,到最后可能變成了PPT大賽,如果說這類競賽的好處,我覺得除了給你提高了拿到獎學金的可能性,對于自身能力的提升以及后續的作業而言甚至意義并不大,而獎學金,能比得上你找到一個好作業后在一個月內賺的錢多嗎?你難道能一輩子拿獎學金過日子嗎?當然這樣的人是存在的,但是我相信大多數讀者也和我一樣,覺得這是一種奢望,
ACM到底帶給我什么了
知識
我在ACM集訓隊的第一周,我所得到的知識,是我的室友們在大學四年內都可能會學不清楚、理不通的知識,而那些知識點,在我經歷了兩年多的ACM訓練后覺得,這些只不過應該是理所當然會的、最基本的知識,這些知識點帶給我的財富,是我在經歷了四五個專案后,才意識到的我們與其他人的差距,ACM的知識點,只要你未來是做計算機行業的,那么它一定會在每一個角落里發揮著它的作用,
思維
ACM的題,對一個人的思維能力的提升有著非常恐怖的作用,特別是當你頻繁的打Codeforces比賽時,你會深切的體會到自己的思維能力在以非常恐怖的速度進步,而與思維能力直接掛鉤的,便是邏輯思路以及問題的敏感性,如果有人去看過杜老師的Codeforces錄播視頻,看過tourist的比賽視頻,你會發現他們基本上并不會去論證一個方法的可行性,他們通常在讀到這道題的時候,會反應過來這題“好像這樣搞搞”、“在隨便暴力一下”、“應該就對了”,這樣的思路也正是我現在打Codeforces的一種感覺,當然我還不能到達杜老師這樣對于這么難的題也可以如此輕松的想出解法,但是我仍然覺得我思考問題的思路和方向變得非常的開闊,而且思考問題的邏輯自然變得嚴謹合理,
代碼實作能力
ACM的題,難度較高的題,有些需要各種資料結構的嵌套,需要各種開辟各種奇奇怪怪的陣列,而你需要在短時間內完成代碼的撰寫和除錯,這無疑是對代碼能力的直接挑戰,例如Codeforces,5道題目只有兩個小時,除掉讀題(純英文題面)和思考問題的時間,你又有多少時間可以來寫代碼除錯代碼呢?當室友還在為編譯出錯煩惱時,我們基本就不需要除錯百行代碼以下的程式,因為只需要簡單的測驗證明其確實沒有錯誤即可,
ACM朋友圈
ACM屆有一個最高級別的競賽,被稱為WF(world finial)——世界總決賽,這場比賽的含金量有多高?也許有人會說,最多也就是拿到金牌可以全球500強隨意挑,但是,實際上只需要你碰到了這個比賽的邊界,你只要有幸被邀請參加了這場比賽,不論你的名次,這個星球上的企業你已經可以隨意選了,而且本科畢業就可以去作業的那種,而我們平時聊天水群,里面有的是因為ACM成績優異而進入Google中國、微軟亞洲研究院的人,而對于正常學業而言,各位也應該知道你需要讀多少年的書才有膽量往這些企業中投遞一份簡歷
學長學姐
通常能堅持下來打ACM的都是能夠在思維、能力、勤奮或者智商上略勝一籌的人,那么和這樣的學長學姐在同一個實驗室的屋檐下打比賽,你能得到的幫助和支持,遠遠超過參加社團帶來的收益,
直面清北復交
ACM競賽是所有隊伍在相同地點使用相同設備在相同的時間內解決相同的題目,
而你的對手則是來自全國的大學,對,北大清華每年都會來,而且非常重視,
ACM從來就沒有院賽、校賽、省賽等等一大堆亂七八糟的東西,雖然他們確實存在但是他們并不是被官方承認的,ACM只有區域賽,(比如Asia-East東亞地區),區域總決賽(比如EC-finial,東亞地區總決賽),和世界總決賽(WF),無論在哪個比賽,你都可能會遇到任何一個學校的隊伍,所以在這樣的比賽中,你可以很清楚的知道自己的水平在全地區范圍內的位置,對自己的能力有一個更好的評估,能夠看到外面更加廣闊的天空,而不是拘泥于那么小的一個地區,爭奪那么毫無意義的第一名
為什么要打ACM
因為我要證明我自己
在ACM比賽中,你會真實的,親身和北大清華等等高校在同一個體育館里,使用相同的設備相同的時間來解決相同的問題,那么你為什么不去證明自己比他們強?我知道這通常不可能,因為他們也會派出他們最強的隊伍來與你們競技,但是我們需要的就是在這么多的強隊中,證明我們自己的能力,在計算機領域內最有影響力的比賽中,證明自己而已
什么樣的人適合去打ACM,什么樣的人不適合去打ACM
ACM競賽是一個需要大量的時間去投入,但是到很久之后才會有結果的產出,這和其他競賽不同,數學建模通常你只需要很短的時間訓練就能拿出成績,而一個ACMer,在大三之前甚至可能都沒有一點點成果,但是你在大一大二的投入終將會給你在大二下至大三上的時候帶來豐富的回報,
這樣的回報,需要愿意投資的人耐心投資才有可能賺得盆滿缽滿,一旦出現懈怠都有可能顆粒無收,耐心、專注、勤奮、自覺這些是一個ACMer必須要具備的因素,
寫給已經進入了ACM的人
我在ACM的訓練計劃
- 保持在Codeforces的個人刷題,最好是現場比賽,其次是復現比賽,Codeforces對訓練一個人的思維能力有者極大的幫助作用,而且其出題非常的新穎,是我認為最適合ACMer進行個人訓練的平臺,Codeforces的思維題數量非常龐大,而且非常的有趣,正式的區域賽等比賽,通常思維題也會占據很大一部分比重,
- 隊伍內保持至少一周一場往年比賽的復現賽,我們隊在長達幾個月的集訓時間內保持了一周兩場比賽且不耽誤正常課程,
- 當你決定要寫ACM題時,請不要斷開,也盡可能避免使用碎片化的時間學習,這對學習的進度沒有任何幫助,除非你只是突然需要回憶一個知識點,
- 在實驗室內寫題而不是在寢室或者圖書館或者其他任何地方寫題,
除了ACM之外的計劃
ACM畢竟只是我們大學的一個工具,我們希望它能夠服務于我們找作業、服務于我們在其他領域的發展,不可以把ACM當成是自己在大學里唯一執著的物件,甚至把它樹立為人生目標,這不合實際也沒有意義,反而會影響你的正常社交與生活,這不應該是一個人的目標,
關于ACM寫題
ACM演算法的學習規劃
在經歷了兩年多的學習之后我發現,其實很多的演算法并沒有太多的學習意義,或者說不必要為其投入過多的經歷去學習,
我是負責隊伍內的圖論+字串,以及構造題思維題,會資料結構,了解dp和樹上問題,
另外一位隊友負責計算幾何和博弈論,以及數論,會dp,了解圖論和樹上問題
還有一位隊友負責了資料結構和dp,以及樹上問題,會數論,了解圖論
基本上可以說是覆寫了所有的知識面,而且大部分知識面都是有多個人會,
我以我熟悉的圖論為例,諸如“最大流”這些個演算法,通常對于一個銀牌隊伍而言,其實學習的意義并不大,因為我至今未見到過最大流題的難度低于金牌題的(按照實際區域賽出題情況)相反,靈活的結合思維和拓撲排序,你會發現圖論問題變得非常簡單,很多區域賽的圖論的銅牌題在你眼里變成了暴力傻逼題,這是對于一個圖論選手在頻繁使用圖論相關的知識點的時候自然而然形成的,
我認為把學習那些過高的知識點重要性低于去熟練掌握最基本的演算法的內容,
對于字串也一樣,上一次看到“回文樹”是在復現賽上看到的,是一道金牌題,雖然對于會“回文樹”的隊伍而言相對簡單很多,但是作為一道金牌題,很多時候在比賽現場可能根本沒有時間去看這樣一道題,
當然你的隊伍是為了沖金牌的,這些知識點當然也應該成為你的必須知識點之一,
我的一些經驗之談
- 看題一定要看資料,通過資料大小猜測演算法的復雜度,再去考慮可能的演算法邏輯,通常為了卡掉錯誤的演算法,正確演算法的復雜度應該在 1 e 6 ? 1 e 8 1e6-1e8 1e6?1e8之間,前者考慮可能有很大的常數的復雜度,后者則是最差的不可能發生的情況下的復雜度,
- 隊伍內除了在最后沖刺的時候,其他時間內務必保證多開,無論何時也不要三個人討論同一個問題,即使你們現在被榜丟下了,甚至很多時候可以嘗試三開
- 隊伍中每個人都應該具備非常良好的代碼能力,除非你們隊伍中專門有數學專業的人幫忙
Shiroha @2020.12.21凌晨1點30分
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238506.html
標籤:其他
上一篇:如何寫出一篇優質的博客(小白篇)
