初識ACM
最早聽說ACM/ICPC這項賽事是在大三上的演算法課上張老師提到的,當時我們學校的組織參加這項活動才剛剛起步,我也沒太在意,總覺得那是非常遙遠的事,事實上當時我也從未相當如今我們能獲得現在的成績。真正踏入ACM/ICPC這個神奇的世界,不得不提到2004那一年我們學校的參賽隊伍xmutank,正是聽了pipo師兄的精彩演講以後我才對這項賽事充滿興趣,真正開始充滿挑戰的ACM之旅。第一真正的訓練是從2004的寒假開始,也許不能說是訓練而應該稱之為“玩”, 事實上我一直喜歡把做題稱之為“玩ACM”,我覺得ACM/ICPC是任何一個熱愛挑戰,熱愛電腦的人都會喜歡的遊戲。面對一道道難題的挑戰,用最優雅、簡潔的演算法在最短的時間內解決問題。為一道難道輾轉反側徹夜難眠,一朝得解欣喜若狂如癡如醉絕不是玩笑。演算法之美,代碼之美絕不遜於遊戲之美。“玩ACM”和玩遊戲一樣會上癮的,我不知道別的ACMer有沒有這種感覺,至少當時的我有這種欲罷不能的欣喜。當時我的“玩伴”是ferret_chao(鄭陳超,csd
02級,我05年的隊友)和arxor(張弛,csd 03級,我06年的隊友)。我們的主要的即時區域是pku online judge,也就是大名鼎鼎的poj。那個時候poj的規模還遠不如現在,題目總數也就是在1200上下,我還記得當時排名第一的是北大的daofeng,過題數也不過600,我們三個後來都超過這個當年的第一了,不過這是後話了。這個時候大家實力都很弱,難題基本不會做,做的都是那些過題人數最多的題目。我們三個也算的上是不打不相識了,本來那個時候在xmu在poj上混的就不多,活躍的也就只有我們三個,結果就是大家都憋著一股勁,誰也不想被誰超過,一有誰過了一道題,另外兩個馬上跟進,非得把它也過了不可。而一旦做出一道別人一直搞不定題目,肯定得得意半天。那種競爭的樂趣,多年以後的今天回想起來仍然曆曆在目。
暑假拼搏
如果說04年寒假的玩耍是一種啟蒙,那麼05年暑假的訓練就可以稱得上真正的刻苦訓練。可以說我們幾個都是自己摸爬滾打走過來,事實上我們很多其他的ACM的強校完全不同,我們從頭到尾都沒有過正式的訓練,完全是依靠到處搜集的資料,論文來學習,這和當時我們學校在ACM方面還沒什麼經驗有關。現在已經好很多,據我所知張德富老師開的演算法課已經引入ACM題目作為實驗,而且我們這幾屆ACM隊伍也留下了很多以前收集的資料。不管怎麼說,當時我們確實是沒什麼經驗,就靠著一本演算法導論就開始我們的集訓。05年我們學校有兩隊,一隊是我,ferret_chao和jason_chen(陳競馳,csd
02級),另一隊是arxor,xmutank(魏麗君,csd 01級,04年的老隊員)和Lucifer(董旭,生物 03級,曾經參加過noi)。這個時候我們開始做一些難題,也不再是孤軍奮戰,而是充分利用集體的智慧。碰到難題,除了自己冥思苦想,三個隊員還會交流解題思路和想法。當時我們隊的三個隊員住在一起,每天同進同出,從早上11點起床到晚上十一點之間,幾乎除了吃飯,都在做題、思考、討論,那是一種全身心投入的快樂。當然,十一點過後是娛樂時間,沒有人可以一整天都緊繃著,勞逸結合才是王道。就是這種投入和交流讓我們的知識積累速度和能力提高速度都大大提高,這一段時間是我們實力提升最快的時候,幾乎每天都有新的收穫,學到新的理論,或者解決新的經典題目。我堅信實戰是學習的最好方式,我始終認為自學能力是所有ACMer,乃至所有電腦學者最重要品質。前面提到中國賽區的競賽要經過網路預賽,而每個學校只能有一支隊伍能進入現場賽(參加過世界總決賽的學校可以多進一支隊伍,預賽前十名的學校也可以多進一支隊伍,我們沒想過能進前十所以假定只能有一支),但我們有兩支隊。所以,要參加現場賽,我們隊面臨的首先是要擊敗另一支隊伍。所以,這個時候我們除了訓練就是關注另一支隊伍的情況,每一場熱身賽都卯足全力擊敗他們。說實話,他們的基礎比我們要好,一個是04年的老隊員,一個noi上來的,都是經驗豐富的老手。不過,我們雖然基礎稍差,但是勝在鬥志十足,要知道我們三個人都是放棄考研機會把所有精力投入這項賽事上,怎麼也不願意付出這麼多到最後連預賽都出線不了(當時系裡面承諾拿到銀牌就能保研,不過後來沒有兌現,只提供了保研複試機會),也許正是這種背水一戰的壓力,才讓我們一次一次的超越自我,最終三次擊敗張弛他們。05年國內有三個賽區,成都,北京,杭州,我們兩隻隊伍在三次預賽都獲得出線權,而我們隊均以微弱優勢稍勝一籌,而且再成都賽區發揮出色獲得兩個出線權,所以最終我們隊去了成都和杭州,他們去了成都和北京。
成都、杭州
成都之行,是我第一次坐飛機,第一次坐火車,第一次出省,第一次參加國家級的大賽,第一拿到銀牌,匯聚了太多太多的第一次。第一次走上賽場的,說不緊張絕對是自欺欺人的,我不知道別人的情況怎麼,我和陳超兩個幾乎一夜未眠,滿腦袋填滿了緊張和興奮。說實話,在成都那場比賽,大家狀態都不算好,而且川大似乎也沒有舉辦比賽的經驗,題目出得難度過高,沒有簡單題練手,直接就面對一堆難題,很有一種被打擊的感覺。當時過的第一題是道無比複雜、噁心的類比題,之所以選這一題是因為其他的題目都沒有思路,只有這種依賴細心和編程技巧的題目我有信心一是。確定題目以後我開始敲代碼,陳超和競馳他們兩個考慮其他題目。花了一個多小時,My Code敲完,居然第一次提交就過了。事實上,這麼順利的過掉這道題目我自己都很驚訝,當時場上還沒有人解出這道題目,賽後我們才知道整場比賽結束也只有兩支隊伍過了那道題目,當時的我絕對算得上是人品大爆發。因為這次爆發,才讓後來我對類比題目有了無比的信心,被隊友戲稱為“類比題之王”,碰到這種題目基本都交給我解決。基於我的超常表現,我們又重拾信心,群策群力經過一番苦思冥想又解決了一道題目,最後以第十六名的身份拿到一塊銀牌。這塊銀牌是我們學校在ACM上取得的第一塊銀牌,也是對我們幾個月來辛苦訓練的一個肯定。兩周之後的杭州之行時值教學評估,沒有人關注我們,這一次我們是獨自踏上征途的。經過了成都之行的洗禮,緊張已經消退,剩下的是激情和信心面對新的挑戰。在這裡,我們見到了大名鼎鼎的LouTianCheng樓教主。不過教主似乎不太狀態,表現居然還不如我們,這也小小滿足了一下我們的虛榮心。而這一次,我們三個隊員一人做出了一道題,最後以三道題第九名拿到了我們的第二塊銀牌,結束了05年的ACM之旅。
北京、上海
一年以後,半數老隊員退役,三位新隊員加入(張俊彬 csd 03,項光特 csd 05,吳篤敏 軟體 05)同時由於上一年的我們在獎牌上的突破,ACM/ICPC在我們學校的知名度提高了不少,除了我們以外還有一些愛好者在做題訓練,現在poj搜一下xmu已經可以看到很多身影,不象當初我們剛開始的時候那麼形單影隻。希望隨著學校對ACM競賽越來越重視,會有越來越多的同學參與道這項競賽當中來,他們都是珍貴的後備力量,有他們才有我們學校ACM競賽的未來。其實我們參賽獲獎除了獲得榮譽,獲得肯定以外,更高興的通過我們的努力讓學校注意到我們,吸引更多的同學進入這項賽事,喜歡這項遊戲。客觀的說,我們學校在ACM上的投入相當的少,不提上海交大誇張的近百萬的經費,就是與其他的一些學校相比也頗有不如,不管是在賽前培訓,訓練機房,還是比賽經費方面都還有很大不足。不過,現在已經有很大改善了,這也是我們的實力得到學校肯定的結果之一。去年另一個令人欣喜的是,我們還組建了一支女隊,她們是(呂武玲
csd 02,林倩瑜 csd 05,黃文秀 csd 05),雖然實力稍差,但確實是開創了曆史。而這一次我的隊友是張弛和項光特(csd 05級)。 客觀的說,這一支隊伍是我們學校有史以來實力最強的一隊,擅長編碼,實戰能力超強的我加上理論紮實,數學功力深厚的張弛,還有一個在noi久經考驗的項光特,我們自信已經有挑戰國內任何一支強隊的能力。在暑假訓練的時候,我們就信心十足,可以說今年我們就是衝著金牌去的。而在poj的熱身賽中兩次奪得第一,更上讓我信心暴增。北京之行就是在這樣的背景之下開始的。在去之前,對清華充滿了憧憬,和大多數人一樣我也曾經夢想過成績清華學子。可事實總是殘酷的,我再次體會到廈門大學的美麗名聲在外確實不是沒有來由的。再加上北京陰沉的天氣,清華競賽的組織不力,心目中清華的形象幾乎破滅殆盡。在後面的現場賽中,我們先是由光特過了一道簡單題,然後我過了一道搜尋,最後他又過了一道博弈。雖然我們只過三道題目,但是由於我們做題的時間都很短,罰時很少,最終只排在過了四道題目的中國科學技術大學之下,獲得第二名,拿到我們的第一塊金牌,並且獲得了參加世界總決賽的資格。能獲得這樣的成績有很多的原因,第一是清華舉辦的比賽,他們自己不能派隊伍參賽,導致名震天下的樓教主沒有出手,第二是傳統強校上海交通大學沒有派隊參賽,這無形中減少了潛在的對手,當然最重要的是我們已經有了足夠挑戰金牌的實力。北京之戰是我們的成名之戰,ACM社區就象是一個江湖,在這裡你最大的依仗是你的實力。所謂一朝成名天下知,等我們到上海大學參賽的時候,就不再是默默無聞,一不小心就被當成是廈門大學的牛人,讓我們很是虛榮了一把。如果說在北京奪金靠的是項光特的神勇表現,上海的金牌就是靠我的人品大爆發,一開始我就過了一道簡單題,然後和張弛討論以後過了一道樹狀dp,接著又過了一道搜尋。稍後,項光特過了一道數學題,最後經過不停的最佳化我終於又過了一道搜尋。最終我們排在了第七,排在我們前的是兩支清華的隊伍,兩支上交的隊伍,兩支複旦的隊伍,由於上交和複旦已經在其他賽區獲得第一不計入排名,而同一個學校只算一個排名,我們最終還是排在了第二。只能拿到第二是有點遺憾,但是已經是超出預料的成績,奪冠的任務就交給將來的師弟師妹了。
東京
只有走出去才知道世界之大,整天窩在廈門這小小一隅確實有點坐井觀天了。說實在的,我對日本這個民族印象很差,大概是在國內負面的報道聽多了,總覺得日本人很猥瑣。實際情況完全不一樣,東京市區我們沒時間去,但是從機場到東京灣希爾頓酒店路上的匆匆一瞥,東京給我的感覺是一個很美麗,很整潔的城市。日本人的確是相當的謙遜有禮,在各個商店買東西的時候感覺特別深刻,服務態度出奇的好,聯想道國內某些商家的行徑,確實令人感慨。不過,這也可能是因為我們住的地方是東京灣度假村,這裡就算是在東京也算是高消費地段。這一屆的ACM/ICPC
World Final 是由IBM日本分部和ACM日本分會聯合舉辦的。賽程設定和競賽場地都和國內賽場不能同日而語,從賽前的Disney半日遊,到IBM提供的技術講座,從開幕閉幕精彩的晚會,到比賽現場周到、體貼的設定,還有每天晚上的CyberCafe,無不體現了他們對比賽的重視。主辦方也一再強調,這不單單是一次競賽,而且是一場世界性的盛會,目的是為全世界的電腦界未來精英提供一個交流的平台。但是,很遺憾的是我們不得不辜負他們的好意,為什麼這麼說呢?很簡單,英文能力不夠,根本沒法交流。不出去真的體會不到英語作為一門世界語言究竟有多大的意義,不管是哪個國家,說什麼母語,只要會說英語就能夠很容易的打成一片,我們這些一出去就成了半個聾啞人的傢伙也就只能看著羨慕,暗下決心回去好好學英語。最後談談Final的感想,我要說這一次比賽是我們表現最糟糕,暴露出弱點最多的一次。這麼說似乎有點王婆賣瓜的嫌疑,但事實就是如此。一開始我們表現還不錯,我過了一道簡單題,接著光特也過了一道簡單題。比賽大約進行了一個小時,這時候光特犯了一個錯誤,他開始做一道關於空氣壓強的數學題,這種題目是他的強項,但可惜的是這是整場比賽第二難的題目,到最後也只有兩隻隊過掉(就是第一的華沙和第二的清華),結果他把時間都耗在上面一直最後都沒解出來,相當於我們隊伍損失了一員大將。接著張弛也犯了錯,他挑的是一道圖論題目,那也是他的強項,結果那是最難的一道題,而且題目有錯誤,到最後都沒人過。而我選的是一道類比題,難度適中,本來說這也是我的強項,可是不知道哪個傢伙出的題目,題意晦澀的很,導致我連續三次看錯題目,過了很久才解決。等第三道題目搞定以後,時間已經過了三個小時。而這個時候,張弛也放棄那道最難的題目了。現在擺在我們面前的有三道題目可以做,一道是搜尋,兩道平面幾何的題目。其實這是一個挽回的機會,比較好的選擇是我去攻搜尋,光特和張弛一人一道幾何題,或者三個人合力攻一道題目,這種策略估計還能做一兩題出來。可是,光特陷在那道題目裡面抽不出來,我一時頭腦發熱選了一道幾何,張弛選了另一道幾何。結果是最後誰也沒弄出來,排到了第44名,這暴露了我們平時比賽都是單幹,到了關鍵時候配合不力的弱點。而對我而言,正常情況而言搜尋是我的強項,那道題我完全有能力做出來,當時沒有去做是完全是因為上一題一直理解錯導致我對那種複雜的題目有了畏懼感,結果錯失良機,心理素質還不夠過關。不管怎麼說,能走出國門,能殺進世界總決賽,見識一下完全不一樣的世界,看到一隻只大牛從眼前飄過我已經很知足了,已經讓我收益終身,小小的失利也不算是很大遺憾。
經驗
ACM競賽涉及的方面很廣幾乎囊括電腦科學的所有方面,主要有下面幾個方面:
1、程式設計能力:熟練掌握一門程式設計語言:C/C++, Pascal, Java。大多數oj上都提供以上三種語言的支援,但Final似乎不提供pascal,語言我推薦C/C++,價格便宜量又足。:)
2、資料結構:棧、隊列、堆、二叉數、並查集、線段樹……事實還有一些我也沒掌握的資料結構,例如說尾碼樹什麼的。
3、演算法:搜尋、動態規劃、圖論演算法、遞推、遞迴、二分、貪心、分治……包括所有經典演算法,還有經典演算法的結合,例如二分加貪心,搜尋加圖論什麼的。
4、相關知識:圖論、數論、組合數學、計算幾何、編譯原理、作業系統、各種的數學結論……有的時候要用到一些莫名其妙的數學結論,這種東西要看出題者的喜好,要是碰上正好知道的,那就是你的運氣了。
訓練方法
1、做題才是王道,過題數超過1000你怎麼說都是個牛人。我們幾個都是做題做出來,當然除了做更重要的是想,不過我認為,讀,做,想是三位一題的,所以統稱做題。
2、讀書,讀論文,尤其是圖論、數論、組合數學方面,很多東西都不是課堂上能學到的,一定要積極主動的找資料看。
3、讀解題報告,有一些難題怪題,沒有類似題目的經驗,很難想出解法,這種時候讀一些解題報告有助於開拓視野,提高解題能力,但絕對不能對太過依賴解題報告。自己實際掌握的東西才是實力。
組隊方案
1、比賽是三個人,配合很重要,誰做什麼題,其他人幹什麼最好都有個計劃。
2、組隊要合理:各項能力最好能互補,例如一個隊伍最好有一個數學強人,在有一個代碼強人,總之各個隊員能力的並集得覆蓋競賽題目範圍
比賽經驗
1、心理素質要好,真正比賽的時候,氣氛非常緊張激烈,心理素質很大程度影響比賽發揮。(Final的時候,我就是差這麼一點)
2、競賽時一定要注意選題,題目太難要懂得放棄,要參考場上其他隊伍都做出來的題目,做的人多的一般比較簡單,不要把時間浪費在沒什麼人做的題目上。(血的教訓啊,大家一定得吸取)
收穫
收穫太多了,可以說參加ACM/ICPC是我大學階段參加的最有性價比的活動了。除了最基本的,腦子裡填充了大量經典演算法,其他收穫還包括:
1、鍛煉數學思維,提高解題能力
2、編程能力、心理素質
3、分析能力、動手能力
4、提高知名度
還有最重要的,玩ACM樂在其中,絕不是任何其他枯燥的課程所能媲美的。
後記
ACM的世界,充滿了激情和挑戰,遠不是我糟糕的文筆所能夠描述,想要體驗它的神奇唯有親自進入方能瞭解。
轉載自:http://hi.baidu.com/laozhonggu/item/34b67bf5e604eab330c1992a