剪輯的樓天城的ACM之路

樓天城樓教主的acm心路歷程(剪輯)

利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個
回顧。昨天是GCJ2006 的回憶,今天時間上更早一些吧,我如今還清晰記得3 年
前,我剛剛參加ACM 時參加北京賽區2005 和杭州賽區2005 的狀況。
2005 年ACM-ICPC——酸甜苦辣
我進入清華大學開始本科學習的時間是2004 年8 月,在進入清華大學的第一
年裏,因爲基礎課學習比較緊張,再加上計算機系不容許大一學生自帶電腦,我沒
有參加2004 年的ACM 比賽。不過在大一一年中沒有中止這方面的練習,對ACM
仍是熱情高漲。
大概在2005 年7 月底,與同班同窗shell(貝小輝)和superzn(張寧)一塊兒
決定組隊參加ACM 比賽。對於隊名沒有太多的想法,就隨便取了一個字典序靠前
一點的bomber。隨後進行的幾場訓練中,個人編程狀態一直保持得很好,訓練比
賽的主要方式都是:我主寫程序,shell 和superzn 負責翻譯題目,思考算法和測試。
這種組隊模式一直沿用到咱們後面的全部比賽中。
2005 年末,咱們報名參加了2005 年的北京賽區和杭州賽區的比賽。順利經過
了預賽進入了現場決賽。記得當時北京賽區預賽的時候,我和superzn 一塊兒在參加
百度之星程序設計大賽,shell 依靠一人之力過了6 題,最後以第二名的資格參加
北京賽區現場比賽。
北京賽區:
2005 年的北京賽區地點設在隔壁的北京大學,因爲交通很是方便,咱們沒有
和大部分選手住在一塊兒,不過也沒有參加Java-Challenge 和晚上的表演。
練習賽以前,說到比賽位置抽籤,自己意義不是很大,但是鄔老師神奇的RP
把兩隻清華的隊伍抽在一塊兒,結果練習賽進行了一半,另外一隻清華的隊伍THU1
(隊員是:吳景嶽,慄師和金凱,好像後來隊名改爲了DreamCatcher,不是很確
定)被要求換到一個比較遠的地方,理由是有些學校以爲這樣不合理。後來不少賽
區也出現過隊伍座位在一塊兒的狀況,鄔老師的RP 果真不是蓋的。
記得練習賽時和復旦的LemonTree(盛城)一塊兒在場地裏閒逛,結果果真不到
10 分鐘就被要求回座位了。還有當時比賽場地是一個體育館,有些隊伍把氣球放
飛以後氣球就飄在天花板下了,總裁判李文新老師還威脅咱們說,若是明天正式比
賽把氣球放飛,就不算經過相應的題目,除非有辦法把氣球取下來。
而後就是比賽的過程了,下面有底紋的文字是我找到的當時留下的比賽總結:
E:快速排序。5 分鐘1Y。
我想5 分鐘的時間能夠爭取這幾年ACM 國內賽區的最快出題記錄了吧。
G:二分答案+最小生成樹。25 分鐘1Y。
這題就是經典的最優比例生成樹問題,咱們一致認爲這題比較簡單。不事後來
被李文新老師批評了,說法是誤導其餘的隊伍。不過說到最優比例生成樹問題,
TCO2006 的時候fwj 和tomek 居然都沒有見過這道題目,這題但是源於POI 呀。我
想咱們認爲這道題目簡單的主要緣由是咱們都在冬令營上見過這到題目,若是第一
次看見,想出算法可能確實須要一些時間。在這裏向被咱們影響的隊伍的道歉,最
終G 提交了200 屢次,可是隻有8 個隊伍AC。
C:二分圖最大匹配。42 分鐘1Y
題目要求計算一張圖的最小覆蓋集,可能惟一的tricky 是發現圖是二分圖。
D:遇到了必定的困難,發現A 很簡單,因而先放一下
D 是一道比較綜合的題目,設計一些簡單的計算幾何和字符串處理的知識。
A:簡單的幾何問題,出現了一個低級錯誤,提交了3 次均爲WA。
A 是北京賽區最簡單的題目,個人程序裏犯了一個很低級的錯誤,可能也是經
驗不足形成的吧。
D:從新寫,可是沒有考慮一種狀況,WA 了1 次。
87 分鐘,復旦的Abuacus 過了4 題佔據了Rank1。因爲隊伍模式的緣由,咱們
在還有不少簡單題目的狀況下卡住了長達30 分鐘。
A:shell 忽然發現了A 程序中的低級錯誤,105 分鐘AC,從新奪回Rank1。
這是很重要的一步,如今想來若是沒有這個發現,後果可能不堪設想。
B:二分答案+2SAT。129 分鐘AC。
B 是一道明顯的2SAT 問題,因爲題目比較長,咱們沒有很早發現這道簡單題。
D:發現了D 的沒有考慮的狀況,140 分鐘AC。
看了一個board,那時Abuacus,Eccentric 都只有4 題,可以在第一次參加正
式比賽就作到6-4 的領先,當時心情很激動,不過因爲缺乏經驗,也影響了接下來
的發揮。其實,如今回想起來,此次比賽實際上是一個很好的AK 的機會。
F:DP。程序比較複雜,WA 了4 次。
F 是一道比較複雜的動態規劃的題目,其實WA 的緣由是一個應該用int64 的
地方,咱們使用了int,這個地方的確很難發現。
H:F 一時沒法AC,只好轉功H。H 就是普通的模擬題。開始沒有考慮坦克和
炮彈可能在1/3 秒相遇,WA 了1 次。
比賽還有一個小時,封板。
H:shell 發現了坦克和炮彈可能在1/3 秒相遇的狀況,250 分鐘左右AC。
對於咱們這種組隊模式,當主寫程序的選手狀態很差的時候,很容易出現連續
卡題的狀況,這種狀況的出現很不利於水平的正常發揮。在北京賽區的比賽中,我
們頗有幸沒有出現連續卡處的狀況。
記得,當時北京賽區的Judge 的半自動的,就是說若是結果是AC,速度就會非
常快,不然因爲人的介入,不能AC 的提交每每須要等一段時間。咱們第2 次提交
H 以後,沒有獲得很快的回覆,覺得已經WA 了,因而我和superzn 繼續測試一些
數據。但此時,忽然有一個mm 從左邊走過來插氣球,這個氣球也成爲了全場惟
一的藍色氣球,這個意外之喜最後成就了第一個分區賽冠軍。
F:下面就是痛苦地提交F,一直戰鬥到最後一刻,WA 了14 次,留下了北京
賽區最大的遺憾。
在最後時刻咱們彷佛發現了那個int64 的錯誤,不過當時思路已經比較混亂了,
沒能改對。F 的問題也致使沒有時間寫I,當時若是直接重寫後者換superzn 來寫F,
徹底能夠在比賽結束前AC。
比賽的大體過程如上所述,那個神奇的氣球,我如今仍然記憶猶新。最終有4
個隊伍攻破7 題,Abacus 的組成應該是盛城,timegreen 和suzhan 吧,Eccentric 中
我只記得辛韜,ZSU_Panku 中我記得Savior(陳實)。上述的老朋友以後見面的機
會就不多了,分區比賽也成爲了我好須要老同窗重要的交流機會了。
我ACRush 的ID 估計就是那時開始使用的吧,轉眼就已經3 年多了。
比賽先後還記得常常與復旦大學的吳永輝老師聊天,在那以後的每次比賽我都
能見到他年輕的身影。
如今回想起北京的分區賽,頗有幸可以在第一次參加ACM 正式比賽就得到分
區比賽的冠軍。我想是因爲現場氣氛對許多隊伍都有不小的影響吧,當時許多隊伍
都卡在幾道比較繁瑣的題目上了,題目的算法性都不是很強。我大概從那時纔剛剛
接觸TopCoder,若是可以早一些,相信會更適應這樣的比賽。
杭州賽區:
2005 年的ACM 杭州賽區比賽在浙江大學舉行,杭州賽區的時間就在北京賽區
結束後一週,最初選擇杭州賽區的緣由很飄逸:我本身家在杭州。實際上也差很少,
我隨隊伍(當時THU 派了3 只隊伍參加杭州賽區的比賽,除了咱們隊以外,
b142857(侯啓明),zhy(周源),ysy(楊 思雨)組隊,另一隻由汪汀,王俊
和黃源河組成)一同抵達杭州車站以後就立刻回家休息了,直到比賽前才趕回。在
北京到杭州賽區之間的一週中,個人狀態就在 不斷下滑,在家中徹底失去了比賽
的氣氛,回到賽場再也找不到感受了。一場悲劇即將上演。咱們先看看比勝過程吧,
下面有底紋的文字是我找到的當時留下的比賽 總結:
G:初看很簡單,可是調試了30 分鐘沒有結果。
G 是一道數學問題,其實《具體數學》書上有明確的公式,不過咱們使用的遞
推方法應該也能夠獲得正確的結果。程序中犯了一些低級的錯誤,因爲實在不在狀
態,調試了30 分鐘尚未找到錯誤。這裏還暴露了一個組隊模式的問題,在後來
的組隊模式中,若是像這樣沒有想清楚算法的題目隊友是必定不容許我去寫的。
A:模擬。41 分鐘AC,當時確定沒有想到這是惟一一道1Y 的題目。
A 是一道模擬題,1Y 的時候已經很晚了,排名也很靠後。
C:圖論。可是因爲堆棧逸出RTE 了5 次,浪費了大量的時間。
C 的問題關於樹中祖先關心的斷定,題目很簡單,實現的方法也很容易,就是
經過一遍DFS 來計算。可是咱們忽視了一個歷來沒有遇到過的問題:堆棧溢出。
並且,堆棧在本地機器上運行過程當中,Eclipse 提供了8MB 左右的堆棧,因此沒有
溢出,可是在提交以後的環境下運行就溢出了。並且每次RTE 以後,咱們一直在
嘗試修改數組的大小,一直沒有找到根本緣由。調試C 的同時,我也嘗試修改G,
結果G 也錯了8 次之多,而且始終都是WA。
I:shell 在我鬱悶地調試C 和G 中AC 了,以前WA 了一次。
I 是動態規劃問題,WA 一次多是忽視了一些邊界狀況。
D:網絡流,沒有想到先貪心進行優化。TLE 了5 次最終沒有經過。
D 就是計算最小割,咱們事先準備了先流推動算法,不過根據這道題目的模型,
先流推動算法遇到最壞狀況:二分圖。因爲當時dinic 還不是很流行,咱們TLE 了
5 次尚未經過。
鬱悶地調試D 和G。
E,B:都嘗試過,可是都出現了不明的問題。
在隨後的時間裏,不斷調試D 和G,可是始終不能AC。以後又嘗試E 和B,E
經過分段的方法能夠處理,B 是數學題目。正常的話E 和B 並非很困難的題目,
可是當時已經很是混亂,連樣例都沒有經過。
最終咱們只過了3 題,排在21 名,經歷了我參加ACM 以來最慘痛的失敗。
此次失敗主要歸過與我狀態太差,基本上什麼題目都不能順利經過。固然題目的選
擇也有很大的問題:G 確實不是難題,可是因爲未知的緣由始終不能經過,後來我
把紙上的程序敲在ZJU 上就AC 了,至於現場爲何不能AC 我如今仍是不能明白。
若是說第一題的選擇直接影響了咱們的信心,那麼D 的堆棧溢出則徹底打亂了我
們的節奏。對於咱們的組隊模式,卡出2 題已經超出了極限,咱們不可能再嘗試
其餘題目。
Abacus 也來到了杭州,他們前期體現了強勁的先期優點,在2 小時就達到了6
題;b142857(侯啓明),zhy(周源),ysy(楊思雨)的隊伍表現得至關神勇,
在最後一小時超越了Abacus,奪得了冠軍。
杭州賽區的失敗至今還是心中痛苦的回憶,不過這個教訓也是對我從此的學
習生活的一種警示。
總結:
2005 年是我第一年參加ACM-ICPC 的比賽,兩場ACM 分區賽,咱們經歷了奪
冠的興奮,也經歷了環顧四周等待比賽結束的無奈。2004 年清華沒有得到任何分
區賽的冠軍,2005 年清華打了個漂亮的翻身仗,前後在成都,北京和杭州奪得冠
軍,並且是三支不一樣的隊伍。
兩個賽區的G 都是有傳奇色彩的題目。北京賽區中,咱們25 分鐘1Y 了G,
致使許多隊伍跟風失敗,最終達到了208 提交8AC 的低經過率。可是,杭州賽區
中,G 從比賽一開始就佔用了咱們大量的時間,直到最後都沒有經過,估計至少浪
費了兩個小時左右。真所謂成也在G,敗也在G。
北京賽區後,POJ 的論壇上傳聞說我曾經說過「起身去廁所,不準碰鍵
盤。。。」,很敬仰那些同窗搞笑和扯淡的功底,咱們雖然定下了以我主寫程序的
組隊模式,可是也很是重視配合和每一個人在隊伍中的重要做用。
當時清華沒有組織校內PK 選拔,選擇了成都賽區的冠軍隊THU1 參加全球總
決賽,當時總決賽隊伍是以參考第二賽區的成績決定的,如今回想起來也是很合理
的。因爲最終咱們未能獲得機會參加全球總決賽,接下來幾個月咱們情緒低落,
bomber 從那時也就宣佈解散了吧。
2005 年的比勝過程中,我見到了許許多多的老朋友。用吳永輝老師的話,
ACM 競賽能夠看做一些老朋友一塊兒進行的一場智力遊戲。
附北京賽區前5 名:
1 Tsinghua University=>bomber First Place 7 788
2 Fudan University=>Abacus Second Place 7 983
2 Shanghai Jiao Tong University=>Eccentric Second Place 7 1084
3 ZhongShan (Sun Yat-sen) University=>ZSU_Panku Third Place 7 1194
4 Peking University=>Monkey King Fourth Place 6 768
找不到杭州賽區的排名了,只發現了這個:
21 THU *bomber3 501 1/41 0/-- 6/197 5/-- 0/-- 0/-- 8/-- 0/-- 2/143 22
謝謝韓家龍同窗的熱心幫助,找到一個排名的連接是:
http://acm.zju.edu.cn:8080/icpc2005/ranklist/index.html
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個
回顧。GCJ2006,ACM2005 和TCCC2006 以後, 2006 年對於我來講是一個大豐收,
今天晚上先回顧Mobile Robot 成立先期的事情吧,明天再總結驚心動魄的ACM 上
海2006 和ACM 西安2006 吧。
2006 年ACM-ICPC(上)——Mobile Robot 的成立初期
回憶到2005 年清華沒有組織校內PK 選拔,選擇了成都賽區的冠軍隊THU1 參
加全球總決賽,bomber 從那時也就宣佈解散了。
早在2006 年初,THU1 準備參加ACM-ICPC 2006 世界總決賽的訓練時,咱們的
隊伍就已經成立了。隊伍其餘兩名選手是一塊兒參加IOI2004 的geworm(鬲融)和
wd.h(胡偉棟)。
Mobile Robot 的組隊比賽:
至於Mobile Robot 的隊名,咱們是爲了記念2004 年4 名參加IOI 的選手第一
次合做的時候使用的賬號,若是回到2004 年的PKU 月賽,也許能夠看到thmr3191
的身影,這個ID 最初是咱們4 人共同使用的。其中thmr 就是Tsinghua Mobile
Robot 的縮寫。固然咱們以爲Mobile Robot 讀起來也比較容易上口。
Mobile Robot 成立以後作的第一件事情就是配合THU1 準備World Final2006 的
訓練,前後模擬比賽了兩次Northeastern Europe(NEERC)的題目。這兩次訓練中,
咱們隊伍的主要模式都是:
(1) geworm 全程負責讀題,思考算法和出數據;
(2) wd.h 和我在比賽前2 個小時一塊兒攻簡單的題目;
(3) 2 小時後wd.h 就開始死磕難題,我主寫程序一直到3 個半小時左右,結
合wd.h 對難題的把握,你們開始合攻難題。
這種拖後中衛的打法,對於NEERC 的題目難度很是合適,兩場比賽咱們都作
到了AK(全過11 題)。這種組隊模式也一直沿用至總決賽。當時wd.h 的狀態很
好,對於NEERC 的題目難度,我以爲世界上很難有隊伍可以有信心作到AK。
隊伍成立初期的順利使咱們更有信心,咱們利用署假時間進行了一些必要的訓
練以迎接2006 年下半年的ACM 分區比賽。
北京賽區預賽——網絡賽賽網絡:
2006 下半年有3 個國內賽區,包括北京,上海和西安,其中北京賽區最早舉
行。2006 年北京賽區的地點設在了清華大學,這也是我惟一一次參與組織ACM 分
區比賽的機會。
10 月 中旬舉行了北京賽區網絡預賽,網絡預賽的參與者是全部報名參加北京
賽區的隊伍,以決定哪些隊伍擁有參加現場比賽的資格。那段時間,咱們隊伍主要
精力放在了 準備比賽上,咱們都沒有參與網絡預賽的命題和測試平臺工做。因爲
清華距離上次承辦分區比賽已經相隔不少時間,直接致使網絡比勝過程中出現了嚴
重的網絡問 題,在這裏做爲清華ACM 隊的一員向受到影響的隊伍道歉。
不 過,我也是做爲「局外人」來了解此次網絡阻塞的,由於我確實沒有參加
任何與網絡賽有關的活動。如今回想起來,我認爲平臺的穩定性是一個不可推卸的
緣由,但 是主要應該歸咎於題目描述和樣例的設計,固然還有測試數據的錯誤。
設想這樣一種狀況,若是一個比勝過程中,從某一時刻起,忽然增長1000 個提交
須要rejudge,而後全部隊伍還都在這一時刻起嘗試提交,我想現有的大部分OJ 都
很難在1 小時以內平息這些提交吧。再舉一個更誇張的例子,若是OJ 準備的測試
機器的測試速度已經徹底跟不上提交的速度,那麼卡住是不可避免的。咱們經過網
絡預賽的教訓總結出一些網絡預賽題目的重要經驗:
(1) 對於容易上手的題目,測試樣例必定要足夠強。
(2) 對於簡單的題目,必須仔細確保測試數據是正確的。
(3) 題目描述必須沒有任何歧義,避免選手經過提交來不斷嘗試各類理解。
若是題目可以頗有效控制提交數目,對於測試系統的要求其實不是很高。例
如復活賽和現場決賽的時候,測試系統會大部分時間處在空閒階段。反之,若是提
交處在上述病態的狀況下,只有很是專業的測試系統才能勝任這樣的挑戰,固然不
包括咱們的測試系統。
總之,對於網絡問題我做爲清華ACM 隊的一員深表歉意,若是還有下一次的
機會,咱們必定努力作得更好。
北京賽區驗題賽:
若是說網絡預勝過程中,網絡出了一些問題,那麼,決賽則是結果更出乎我
們的意料以外。在北京賽區現場賽以前幾天,咱們3 支隊伍進行了驗題賽,比賽
雖然不正式,可是過程仍然很激烈。
先列一下決賽的9 道題目吧:
A. Robot
B. Animal Run
C. Another Minimum Spanning Tree
D. Connect It, If You Can!
E. Guess
F. XAR
G. What a Special Graph
H. Ruler
I. A Funny Stone Game
現場賽只有BEHI 這4 道題目有隊伍成功經過,但是在驗題賽中咱們隊伍的進
程徹底不是這樣,下面是咱們的作題狀況:
22 分鐘 A 題,數學方法,1Y
首先,咱們3 支隊伍在30 分鐘以內都1Y 了A 題。A 題是一道中等難度的數學
題,可能A 題須要明確高次等差數列的求和公式,並且經過枚舉來代替一些假設
能夠大大簡化問題。現場比賽時有些隊伍作了不正確的假設致使始終WA。
記得當時zhuzeyuan 使用了一個奇怪的貪心方法,後來被OpenGL 找到一個反
例,這個測試用例被添加到正式比賽的測試數據之中,這個反例也成爲了現場賽中
使得許多提交WA 的重要數據之一。
30 分鐘E 題,貪心,1Y
E 是2006 北京賽區最簡單的題目,只須要直接的貪心法就能夠解決。
52 分鐘H 題,深度優先搜索,1Y
H 是一道搜索題,題目時限不是很緊,不須要太多的優化就能夠經過。
75 分鐘I 題,標準的博弈SG 問題,1Y
I 是標準的博弈問題,經過計算SG 就能夠獲得結果。這題其實有一個陰險的
地方,就是當某位置石子爲大於0 的偶數時,也須要考慮以保證結果的字典序最
小,好在咱們及時避開了這個陷阱。現場不少隊伍調入這個陷阱中,耽誤了一些時
間。
129 分鐘B 題,最短路徑問題,3Y
B 是一張平面圖的最大流問題,因爲圖形比較有特色,因此能夠建圖來計算最
小割。可是這張圖有106 個點,2*106 條邊,最短路徑須要用堆來輔助實現,首先
因爲數組開小了RTE 了一次,而後因爲用map 實現TLE 了一次。這題浪費了許多
時間。
G 題,實現和調試了30 分鐘,超時
G 是2006 北京賽區最困難的題目之一,題目描述很簡單,判斷一張圖是否爲
co-graph。咱們算法的複雜度是O(n*m/32)的,不過因爲數據個數比較多,程序運
行時間遠超過了時限。
C 題,貪心法實現50 分鐘,WA
C 題是計算平面圖曼哈頓最小生成樹,直接計算是O(n2)的,可是題目中n 接
近100000。我使用了一個貪心算法,其實和標準算法差距不大,不過仍是致使
WA。其實提早寫C 不是很合理的選擇,當時沒有注意到D。C 和G 難度相差無幾。
230 分鐘F 題,構造,1Y
F 題是很變態的構造問題,這題徹底是wd.h 作的,我至今還不是很清楚算法。
250 分鐘D 題,計算幾何,2Y
D 題是一道比較複雜的計算幾何,當判斷一條直線是否穿過一個多邊形的時候
忘記考慮了一種狀況,WA 了1 次。現場許多隊伍其實都只忘記考慮了這一種狀況,
可是惋惜沒有隊伍該正確。
這場比賽最終咱們隊伍以7 題結束,另外兩隊也都經過了7 題。咱們所以也
沒有修改題目難度,隨後讓你們沒有想到的是:一場極低經過率的比賽即將開始了。
北京賽區現場賽:
現場比賽中,我負責在某一個房間爲參賽選手送打印資料,比賽60 分鐘左右
因爲技術問題到Judge 室處理一些問題。通過5 個小時的比賽,最終中科大
Student 隊經過4 題得到冠軍,廈門大學btALT 經過3 題得到亞軍,北京大學
RPWT,浙江大學gogogo 和合肥工業大學Love Wisdom 也都經過3 題分列3-5 位。
最終Student,btALT 和Love Wisdom 進軍總決賽。
回顧比賽現場過程,首先讓咱們出乎意料的是E,E 是2006 北京賽區中最簡
單的題目,貪心法的方法參加比賽的同窗都想到了,但是有一個小小的細節,對於
實數比較大小時,須要加入一個微小量eps 來控制精度。E 題沒有加eps 的提交佔
到總提交的50%以上,咱們稱之爲「經典提交」。這個小tricky 不慎致使不少隊伍
遲遲不能經過第一題,對許多隊伍的狀態有不小的影響。
其次是A,A 題收到了不少隊伍的提交,可是最終都沒有隊伍經過A。緣由是
你們作了一些不保證正確的假設,當時咱們都經過枚舉的方法避免了這些假設。
另外,有一些隊伍提前接觸了F 和G,並深深地陷入其中。中科大早在240 分
鍾就經過了第4 題,但是以後他們在G 上花費了很多精力,咱們甚至想跑到他們
那裏告訴他們G 是最難的。
記得180 分鐘到240 分鐘,咱們只接收到了不超過10 次提交,每次你們聽到
提交的聲音,全部Judge 一塊兒點鼠標搶測試權。後來,在TCCC2006 上和Ying 提及
此事,據他說和2004 年的廣州賽區有許多類似之處。
總結:
祝賀全部得到好成績的隊伍,恭喜Student,btALT 和Love Wisdom 進軍總決
賽。並再次對網絡賽給你們帶來的不便道歉。後來清華舉行了名爲復活賽的比賽,
我想復活賽應該就是從那時開始出現的吧?
當年清華一共有6 支隊伍,可是隻參加兩個賽區的比賽,形成每一個賽區以前
都要進行小規模PK,最終只有4 支隊伍有機會參加ACM 分區賽。Mobile Robot 建
立之初比較順利,得到了參加兩個賽區比賽的機會,迎接Mobile Robot 的將是上
海和西安賽區的挑戰。
咱們3 人可以走在一塊兒,要感謝吳文虎老師的支持,組隊初期雖然沒有經歷
大戰,可是那些快樂的時光至今都很難忘懷。
附北京賽區排名
1 University of Science and Technology of China=>Student First Place 4 628
2 Xiamen University=>btALT Second Place 3 417
3 Peking University=>KU RPWT Third Place 3 460
4 Zhejiang University=>gogogo Fourth Place 3 471
5 Hefei University of Technology=>Love Wisdom Fifth Place 3 477
6 Fudan University=>Yin-Yang Sixth Place 2 204
7 Tianjin University=>TJU_Rhythm Seventh Place 2 212
8 Beihang University=>L3 Eighth Place 2 254
9 Peking University=>KU4 Ninth Place 2 275
9 Harbin Institute of Technology=>IAC Ninth Place 2 282
10 ZhongShan (Sun Yat-sen) University=>ZSU_Pyrenean Tenth Place 2 288
11 Zhejiang University=>hoebus Eleventh Place 2 311
11 University of Electronic Science and Technology of China=>Gryffindor Eleventh Place
2 319
12 ZhongShan (Sun Yat-sen) University=>ZSU_Himalayas Twelfth Place 2 324
12 Fuzhou University=>OrOrz Twelfth Place 2 412
13 Beijing University of Posts and Telecommunications =>Vitamin Thirteenth Place 2 432
14 Ningbo Institute of Technology,Zhejiang University=>impact Fourteenth Place 2 435
15 Huazhong University of Science and Technology=>rodimus Fifteenth Place 2 442
16 Nanjing University=>HOENIX Sixteenth Place 2 459
17 Fuzhou University=>Laplacian Seventeenth Place 2 467
17 Fudan University=>Shuangwaiwai Seventeenth Place 2 500
17 National University of Defense Technology=>Robust Seventeenth Place 2 517
18 Fudan University=>Free Wings, Yeah! Eighteenth Place 2 518
18 Hong Kong University of Science and Technology=>HKUST1 Eighteenth Place 2 692
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做
個回顧。GCJ2006,ACM2005 和TCCC2006 以後,2006 年對於我來講是一個大豐
收,昨天晚上回顧了Mobile Robot 成立先期的事情吧,今天先發驚心動魄的ACM
上海2006 吧。
2006 年ACM-ICPC(中)——Mobile Robot 上海對決
回憶到,當年清華一共有6 支隊伍,可是隻參加兩個賽區的比賽,形成每一個賽
區以前都要進行小規模PK,最終只有4 支隊伍有機會參加ACM 分區賽。Mobile
Robot 創建之初比較順利,得到了參加兩個賽區比賽的機會,迎接Mobile Robot 的
將是上海和西安賽區的挑戰。
比賽前:空前的豪華陣容
記得清華大學出發上海賽區的時間是10 月20 日晚上,至於爲何能記得如此
精確,是由於在那以前我經歷了真正意義上的「趕火車」。10 月18 日TCCC2006
在聖地亞哥落下帷幕,19 日從舊金山機場起飛會北京,飛機着陸時間是20 日下午
2 點半,進海關以後已經快4 點了,我當即乘坐機場大巴直奔火車站與大部隊會合,
之間都沒有時間回寢室。
來到中亞飯店報道拿到參賽隊伍名單的時候,就赫然發現上海2006 的參賽隊
伍實力達到了幾年來一個不可逾越的巔峯。上海交大的1234 隊都出如今了名單中,
還有浙大和北大的Final 隊都來了,這些還不夠,蕪湖一中的Loner(周冬),上海微
軟ATC 的lympanda 也參加比賽。上海交大一直是這幾年來清華國內最強勁的對手,
現在交大又佔據主場優點,實力深不可測。上海微軟ATC 雖然是旅遊隊,可是
lympanda 憑藉在TopCoder 上的表現,沒有人敢輕視這位無冕之王的實力。
對於上海賽區,清華也派出了華麗的陣容,參賽的有3 支隊伍,除了Mobile
Robot(我,geworm(鬲融)和wd.h(胡偉棟))以外,還有鼎盛時期的Shangri-La
(b142857(候啓明),lxd(林希德)和zhuzeyuan(朱澤園))以及後來的西安賽區亞軍
GotoFly(zcgzcgzcg(朱晨光),wangjun(王俊),tedcn(龍凡))。記得練習賽以前,
你們一塊兒圍圓桌吃飯,朱晨光忽然和旁邊的王俊說,好像就咱們兩個沒有參加過
IOI,而後另外一邊林希德補了一句,就咱們三個不是金牌。
我第一次有機會敬仰候啓明的時候,是本身第一次參加NOI——NOI2002 天津,
候啓明以滿分的成績得到冠軍,當時的亞軍就是林希德。以後的冬令營,我以非正
式營員參加測試神奇得得到第三名,但更重要的是冬令營測試的冠亞軍就是候啓明
和林希德,以後我再沒有和兩位前輩在OI 上交過手。時光飛逝,我表明bomber
隊參加2005 年的杭州賽區,被候啓明領軍的Legendary Team打得一敗塗地。隨後
2006 年初的Google Code Jam China(GCJC)2006 上,我得到第三名,記得當天與獲
得亞軍的候啓明同住在總統套房。其實在上海賽區以前我沒有在正式比賽中打敗過
他們。Shangri-La 的另外一人zhuzeyuan 如今是個人隊友,記得他當時在TopCoder 仍
然是Target(你但是早點在今年Final 以前把Target 拿回來呀,幾回漲停就能夠
),實力也不在前二人之下。
面對知根知底的Shangri-La,你們都知道一場大戰在即,從實力上分析,我覺
得Mobile Robot 略弱,不過賽前咱們都沒有信心必定可以在比賽中佔據優點。而
且咱們內心深知,上海賽區的結果將頗有可能直接決定清華大學當年的總決賽隊伍。
面對這種殘酷的現實,咱們都迫不得已,有時一些有實力進軍總決賽的隊伍在清華
都沒有機會參加分區比賽。
我的的經驗看來,我認爲在平分秋色的時候,最重要一點是明白本身的優點和
劣勢所在,要用本身最強的方面來對抗對手,避免暴露出本身的劣勢。我想在這一
點上Shangri-La 可能沒有咱們作得好。Shangri-La 的優點是三人的整體實力很強,
他們徹底能夠採用三大高手的組隊模式;咱們組隊時間長,配合默契,並且當時自
己剛剛從TCCC2006 以100%正確率回國,保持了良好的狀態。從單人比賽上講,
當時個人狀態即便有Petr 和Tomek 在場,我都並不認爲本身必定會有明顯的劣勢。
比賽場地是上海大學的一個大致育館,現場氣氛很熱烈,想到咱們用4 個機房
辦的北京賽區的現場比賽,不禁地以爲有些寒酸。
在場外碰到了lympanda,他向我瞭解剛結束的TCCC2006 的狀況,我因而給
他描述了一下幾道現場比勝過程中1000 分的題目,結果所有都被panda 秒殺了,
無限敬仰呀!同時也第一次見到了周冬。
提一件飄逸事情,記得當時練習賽有3 題,封版時沒有隊伍經過B 題,可是其
實在封版後咱們經過了這題,咱們應該是當時惟一在練習賽中AK 的隊伍。記得之
後好像還和中山大學的郭老師交流過這題。不過至於B 爲何可以AC:B 題是一
道須要SPJ 的題目,但是練習賽的時候沒有SPJ,而我又堅信本身的程序是正確的,
因而我不斷提交。多是因爲Judge 不耐煩了,才用Yes 的方法讓咱們中止。
比賽以前的晚上咱們都休息得很好,次日早上以充足的精力迎接史詩般的上
海賽區決戰。
比勝過程:400 米賽跑
中學是很喜歡參加400 米比賽,400 米比賽從起跑姿式角度應該認爲是短跑,
可是400 米已經遠遠超過了衝刺極限。因此400 米跑中,要求咱們從發令槍響起的
時候就加速啓動,直到拼盡全力爲止。
咱們回顧一下比賽的過程吧,上海賽區比賽以後,咱們寫下了詳細的比勝過程:
按照一向的方法,鬲融從A 開始讀,胡偉棟從J 開始讀,我準備編程的環境,
而後從中間選擇題目讀。鬲融讀完A 後,發現A 是一道簡單題。因而選擇先寫A
題。
A:給定ACM網上預選賽的比賽晉級規則,求每所學校的晉級隊伍數。
簡單模擬題,時間複雜度O(N)。本題題目有一個疑問:一個學校出線的隊伍
數目可能比該學校參加預選賽的隊伍數目還多,可是題目描述和樣例代表不須要考
慮這種狀況。
ACM 比賽的第一題的選擇對比賽的進程影響很大,當沒有優先選擇比賽中最
簡單 的題目時,更須要保持冷靜。
在我寫A 的過程當中,鬲融看了B 和C,發現C 也很是簡單,因而立刻作C。
C:將一棵節點帶權的樹劃分紅兩半,使兩半的權值和的差最小。
枚舉或者樹的遍歷,時間複雜度O(N)。去年有一個深入的教訓:當遍歷樹的
時候,很容易形成堆棧溢出(杭州賽區留下的疙瘩)。對於本題的範圍,保險起見沒
有使用DFS,而是使用BFS。使用BFS 略微增長了編程量,可是能夠在必定程度
上避免沒必要要的麻煩。
鬲融發現D 是一道經典的統計題,在不到3 分鐘的討論後,咱們得出了可行的
算法,因而下面寫了D。在寫D 的時候,鬲融和胡偉棟把題看完了,通過討論,
決定胡偉棟開始想一道數學題I,而鬲融繼續看題義不是很清楚的G 和J 兩題。
D:給出平面裏的一系列點,要找一個矩形,使矩形邊上的點最多。
離散化後,先判斷一條直線的狀況。枚舉兩條橫邊,而後枚舉豎邊,一旦一條
右邊的邊比左邊的邊好,左邊的邊就不會再有做用。所以,枚舉豎邊的過程很容易
作到O(N),總的複雜度是O(N3)
這題其實存在O(N2logN)的算法,我想出題人也應該沒有在第一時間想到吧。
作出D 後寫了B,緣由是B 的算法相對簡單。可是意想不到的是:B 的樣例不
合法,並且Clarification 的速度很是慢,因而只好先把B 放在一邊。這個過程浪費
了很多寶貴時間。
隨後看到team109(Shangri-La)過了一道紅色氣球,感受是G,因而鬲融給我講
了G,可是發現G 實在不像算法簡單或程序簡單的題目。
此時,胡偉棟推出了I 的一個很簡明的公式。並且咱們發現I 的氣球也是紅色
的。剛纔看G 極可能是被誤導的。因而寫了I。
寫I 的過程當中,因爲鬲融看的題基本已經被作完了,胡偉棟給鬲融講了H 的題
意,鬲融想出了一個可行的作法,不過因爲還有更簡單的題並無立刻作。
I:求楊暉三角形第N+1 行不能被質數整除的數的個數。
能夠找出規律,而後寫出公式,時間複雜度O(logN)。我在並不知題目意思的
狀況下寫過了I,依靠胡偉棟的公式,咱們度過了這次比賽第一段艱難的時期。
從過D 題到過I 題,大概有40 分鐘的時間。這段時間咱們主要的失誤有:
(1) B 的樣例不合法,這其實不是咱們的錯誤。
(2) 受氣球顏色的誤導,過早思考一道很難的題目。
(3) 後來聽朱澤園的建議:因爲一我的的問題致使卡住,應該一我的解決,不
應該讓全隊都陷入混亂中。
我認爲咱們直接選擇寫另一道題目主要有兩個緣由:一是B 卡住的緣由比較
特殊,不是咱們花時間就能克服的;二是I 的算法比較清楚,很是穩定。
等I 過了以後,B 的Clarification 出來了,Judge 換了一組樣例。因而開始調B。
B:給出16 個數,將他們排成十字架形,使力矩平衡。求本質不一樣的方案數。
十字架一共有4 個「臂」。首先找出一個「臂」的全部狀況。而後將等值的無
重複的合併成兩個相對的「臂」。而後從16 個數中選出8 個,將他們做爲一組,
另外8 個做爲另外一組,這種方案的總數爲前8 個成對的方案數乘後8 個成對的方案
數。最後把方案數求和除4。
本題屬於搜索題,並且時限特別緊,因爲搜索問題的優化空間每每很大,並且
又是多組數據,因此很容易形成TLE。在調對樣例後TLE 了一次,改進了算法後
因爲開小數組RE 了一次,終於在第三次提交經過了B 題。
記得高中時一次在網上作題(只記得是xreborner 出的題目)的時候,比賽一開始
就寫一道時限很緊的題目,估計開始程序的正確性是沒有問題的,就是效率比較低;
可是,在不斷優化的過程當中改錯了程序,致使1 個小時之後當程序不TLE 了之後,
程序變成了WA。這樣使得信心徹底崩潰。
聽了不少同窗討論以後,發現很多隊伍就徹底卡在了B 題上。之後對這種題目
只能倍加當心,如今咱們尚未什麼特別好的方法。並且,B 題的樣例只具備測試
性,不具備調試性,編程時必須特別仔細才行。
這時大概才1 個多小時,咱們看似順利地經過了5 題;可是現場的狀況並無
任何優點可言,Shangri-La 在幾分鐘後經過第5 題,兩個隊伍的罰時只相差1 分鐘。
隨後咱們到達了第二段艱難的時期,主要緣由是鬲融把F 的題目看漏了一個條
件,與胡偉棟討論後誤覺得這個題比較容易,很快這題出現Run-time Error 好在重
讀題後發現錯誤並及時放棄,沒有再浪費時間去把Run-time Error 調成WA。若是
當時死作此題則後果不堪設想。
在鬲融和胡偉棟分別讀F 的程序以及題目的時候,因爲如今剩下的題目都比較
複雜,咱們選擇了一道相對清楚的題目H 繼續作。
H:對一個集合進行兩種操做:插入一個數和詢問MOD Y 最小的數中最後一
個數。
因爲數字的範圍是[1..500000],先選擇一個合適的M。當Y<=M時,經過插入
時直接保存來處理,當Y>M 時直接枚舉,用並查集求一個元素的後續。這樣每一
次操做的時間複雜度是O(Sqrt(500000)).
可是,開始選擇M爲1000,並無充分估計複雜度的平衡性。開始咱們認爲
並查集的常數較大,可是後來感受到並查集的常數相對小一些,因而把M選爲
500 就過了。後來在同出題人交流的時候,被告之M取在400-800 的範圍內均可以。
第二段艱難的時期的緣由可能不只僅是題目看漏,也因爲題目難度已經增長。
好在當時特別是當H 的程序TLE 以後,咱們都比較冷靜,相信本身H 題的算法是
正確的算法,只是參數的選擇不夠合理。這種考驗在平時通常是不多遇到的,經受
此次考驗以後,再遇到相似的問題,咱們應該可以更冷靜一些。
過了H 以後,鬲融已經再次確認了J 的題意,隨着氣球的指引,咱們決定攻克
本次比賽最大的「紙老虎」:J,而作J 的過程當中胡偉棟一直在想G,已經大體得
到了算法的框架。
J:給出一些數的大小限制的關係,求更精確的關係後者判斷爲矛盾。
轉換成圖的模型,不斷迭帶調整,直到不能調整爲止。固然這題因爲大小限制
關係中既有’<=’還有’<’,因此須要判斷XI<XI 是不合法的。時間複雜度O(N
3)。
J 題的數據輸入輸出比較複雜,可是題目自己很簡單。這題對編程能力提出了很高
的要求。
經過J 題以後,看了一下board,當時Shangri-La 只有5 題,不過在咱們還沒
有反應過來的時候Shangri-La 就也一樣7 題了,罰時上咱們領先4 次提交。
在比賽的前200 分鐘,我延續了TCCC2006 的良好狀態。咱們配合默契,在面
對BHJ 這樣瑣碎的題目時,隊友會提早把須要注意的細節總結在紙上,整個 過程
都保持得很平滑。另外,鬲融和胡偉棟在我作每一題時都準備了很合適的測試數據,
大大減少了我測試的時間並頗有效地提升了提交正確率。因爲剩下的題目難 度明
顯高出一個檔次,在經過7 題時的罰時領先是最後得到比賽勝利的重要砝碼。
如今剩下的只有E,F,G 三道沒有隊經過的題目了,其實最終也沒有隊伍通
過。咱們曾經讀錯過F,所以此次分別嘗試了E 和G,可是都失敗了。這裏咱們曾
經討論過先作E 仍是先作G,當時面臨的選擇是:E 的複雜度估計較高,不知優化
後可否經過,而G 的算法性更強,胡偉棟仍然沒能徹底清楚如何解決,實現的復
雜度高於E。咱們此次帶有賭博性的選擇了E,並無仔細考慮若是E 的時間要求
過於嚴格會出現什麼問題(可能與B 的相對輕鬆經過有必定關係),在此後的比
賽中咱們應該注意周全考慮,儘可能選擇題意清楚而且複雜度容易估計的題目。
E:帶限制的有向圖的第K 短路。
本題其實有標準的A*算法,咱們也使用了這個算法。但因爲複雜度太高,我
們的程序一直TLE。據Judge 說這題對時間的要求很是嚴格。
G:在一個森林的若干點佈置儀器,儀器有做用範圍D,儀器之間的距離須要
大於等於D,求最大的覆蓋長度和最小的權。
本題能夠使用二次方狀態的動態規劃,相似CTSC2004 的一題。我和胡偉棟討
論後成功想出了正確的方法,而且在最後時刻寫出了程序,而鬲融和胡偉棟則出了
一些測試數據,將數據調事後時間已經很緊張了。首先因爲忘記優化floyd 超時了
幾回。在優化了floyd 算法以後,仍是沒有考慮到圖不連通的狀況,未能在比賽結
束前調出。
F:給出一些公理,假設和定理之間的關係,依次嘗試,推出儘量多的定理。
在同等狀況下要求使用的假設最少。
本題能夠用最小費用最大流解決,可是比較容易實現的網絡流算法都很難在時
限內出解。
如今看來,EFG 三題中的E 沒有比賽中想像得那麼難,當時比賽中受到巨大壓
力的影響沒能攻破此題,不過FG 題即便出如今CTSC 難度的比賽上也很是合適。
比賽結束:罰時險勝
比賽結束時咱們與Shangri-La 同爲7 題,上海交大一隊最終也經過了7 題,我
們依靠罰時的微弱優點險勝。通過驚天地泣鬼神的300 分鐘,咱們終於得到了夢寐
以求的2006 上海賽區冠軍。Mobile Robot 憑藉着上海賽區的奪冠,已經能夠認爲
得到了進軍2007 東京世界總決賽的入場券。
比賽結束後見到了不少復旦的老朋友和吳永輝老師,吳老師仍是和之前同樣,
玩笑開個不停。那些復旦的老朋友賽前因爲是參與出題,咱們一直沒有看到,頒獎
儀式以前,咱們終於有機會在後場一塊兒聊天。不過聊天這些時間中,我和b142857
錯過了郭老師在頒獎儀式前進行的「點名」(當時郭老師要求咱們上去講解題目),
實在很差意思。
總結:
首先向Shangri-La 致敬,即便在最後一刻,相信你們都還仍然有機會,棋逢對
手也是我ACM生涯中的一大幸事。當兩支隊伍都經過7 題的時候,排在第3 名的
隊伍纔剛剛5 題。也就是說,咱們兩支隊伍其實只用了2/3 的比賽時間就鎖定了上
海賽區的冠亞軍。
上海交大一隊最終也經過了7 題,比賽開始時咱們就注意到了交大開場時很是
不順利,不過頑強的交大一隊穩紮穩打,在最後一小時也成功經過了第7 題。在這
裏向交大體敬,開場的種種不利不亞於我在杭州2005 時的起跑,大家可以沉着應
戰,破釜沉舟的精神一直值得咱們學習。當時交大一隊中有一位來自遼寧的選手辛
韜,記得NOI2003 以前咱們有數次交手都以我失敗了結,後來常常在許多網上比
賽中切磋,2005 年ACM 北京賽區也有你熟悉的身影,在清華早有耳聞你在交大的
優異成績,祝福你從此愈來愈好。
此次比賽的命題工做是由復旦大學擔任的,復旦大學的命題特色與東歐的命題
風格很接近,題目的算法性偏強,題目對程序運行速度要求廣泛高。
按照panda 的說法,上海微軟ATC 隊因爲一些配合的失誤,最終只經過5 題,
不過也是前10 的隊伍之一。另外,蕪湖一中隊也順利經過5 題排進前十。GotoFly
經過第3 題的時候還排在第3,不事後來卡死在J 上了,有些惋惜。
後來,分配總決賽名額的時候,上海賽區獲得了10 個總決賽名額,這個數字
相信也是這些年來的之最吧。
這是一場值得記念的比賽,參加2006 上海賽區的強隊實力遠高於幾年內的各
大賽區,可以站立在上海賽區的最高領獎臺是Mobile Robot 得到的最高榮譽之一。
經歷了上海賽區大戰的洗禮,接下來的西安賽區出場的則是更成熟的Mobile Robot。
附上海賽區排名:
1 Tsinghua University => Mobile Robot 7 617
2 Tsinghua University => Shangri-La 7 709
2 Shanghai Jiao Tong University => Lacotix 7 1034
2 Fudan University => Symphonic Rain 6 924
2 Shanghai Jiao Tong University => Prodigies 6 957
2 Fudan University => ShuangYY 6 1098
2 Xiamen University => btALT 5 534
3 National Taiwan University => puyo 5 563
4 The First Middle School of Wuhu => WHYZ 5 652
4 Microsoft ATC Shanghai => Core-Stop-Dump 5 729
4 Zhejiang University => Golden Keyboard 5 817
5 Peking University => PKU_T2 5 819
6 Zhejiang University => Dasher 5 956
6 East China University of Science and Technology => Redfield 4 325
7 Tsinghua University => GotoFLY 4 367
7 Zhejiang University => sago 4 392
7 National University of Defense Technology => Robust 4 438
8 Zhongshan University => ZSU-Tanglha 4 512
9 Tongji University => Revenge 4 559
10 Shanghai Jiao Tong University => H-E-A-T 4 600
10 Xidian University => ACMore1 4 602
11 Wuhan University => Moonmist 4 723
12 Zhongshan University => ZSU_Olympus 4 765
12 Nanjing University of Science and Technology => Narcissus 4 774
13 Northwestern Polytechnical University => 1010 1100 4 845
14 Harbin Institute of Technology => Gaminerie 3 200
15 Fudan University => White * [ Bear + Dew + Cloud ] 3 337
15 Zhongshan University => ZSU-Everest 3 360
15 Hefei University of Technology => Happy For Unpain Teeth 3 406
16 Beijing University of Posts and Telecommunications => Neon 3 442
17 Shenzhen University => Aspire 3 453
18 Harbin Institute of Technology => Corsair 3 457
18 Nanjing University of Science and Technology => backbones 3 461
18 South China Agricultural University => scau_update 3 468
19 Huazhong University of Science and Technology => rodimus 3 480
20 Ningbo University => ACHC 3 505
21 Peking University => www_pku 3 513
21 Fuzhou University => OrOrz 3 520
22 National University of Defense Technology => Puzzle 3 520
22 Donghua University => Gespenst 3 535
22 Hunan University => Footmen 3 535
23 Tianjin University => TJU_Rocket 3 563
24 National Taiwan University => ABCDE 3 568
24 Nanjing University of Aeronautics and Astronautics => ZipFish 3 575
25 University of Electronic Science and Technology of China =>
transistor 3 599
26 Shanghai Jiao Tong University => Lucifer 3 608
26 Zhengzhou University => ZZU_cheapwine 3 650
27 Wuhan University => Silence 3 685
27 Hangzhou Dianzi University => MP3 3 687
28 Jinan University => JNU-FLY 3 830
29 Huazhong Normal University => Neptune 3 857
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做
個回顧。GCJ2006,ACM2005 和TCCC2006 以後,2006 年對於我來講是一個大豐
收,晚上發ACM 西安2006 吧。
2006 年ACM-ICPC(下)——古城西安
艱苦的ACM2006 上海賽區結束以後,咱們本來覺得清華會選擇另外3 支隊伍
參加西安賽區的比賽。何況,大三的課程的實驗任務很重,咱們也就中止了計劃的
按期訓練。大概在25 天以後,12 月20 日左右忽然收到鄔老師的通知,準備出發
參加ACM 西安賽區比賽。咱們的2006 西安之旅也就是在這比較倉促的準備中開
始的。
西安賽區以前,咱們沒有定下明確的目標,比勝過程中到處都採用了追求穩健
的方法,當時也是爲了不一年前的杭州悲劇重演。
西安的比賽沒有太多興奮的AC,沒有驚心動魄的場面,全部過程都在相似旅
遊的氣氛中結束了。做爲Mobile Robot 的最後一戰,這裏也做一個簡要的回顧吧。
因爲此次題目又是Srbga(劉汝佳)命題的,我最後也順便列舉一下我總結的他命
題的特點吧。
比勝過程:
2006 年清華一樣派出了3 支隊伍參加西安賽區,除了Mobile Robot(我,
geworm(鬲融)和wd.h(胡偉棟))以外,還有Panacea(OpenGL(唐文斌),zhy(周源)
和liuhe(劉賀),若是你第一眼看見這個詞就知道是什麼意思,我相信您必定準備過
GRE 吧?)以及一塊兒參加過2006 上海賽區比賽的GotoFLY(zcgzcgzcg(朱晨光),
wangjun(王俊),tedcn(龍凡))。
2006 年冬天是我第一次來到西安,剛下火車就深深感覺到了西安的古城氣息。
到達賓館以後,咱們作得第一件事情就是玩,印象很深的是鐘樓,鼓樓還有大雁塔。
咱們作的最主要的事情能夠用GotoFLY 的4 個大寫字母GFLY 來表示,就是「公
費旅遊」。
比賽以前的晚上,咱們認真討論了比賽中採用的策略,參加西安賽區沒有太多
傳統強隊,咱們一致以爲應該優先採用比較穩健的策略。賽後有比較簡短的總結:
按照一向的方法,鬲融從A 開始讀,胡偉棟從J 開始讀,我準備編程的環境,
而後從中間選擇題目讀。與上海賽區相比,比較順利的是我一下就看到了一道比較
簡單的題目B,因而我立刻寫了B 題。
B:使用火柴棒拼接數字,給定n,m,求使用不超過n 根火柴棒拼成的m 的倍
數中最大的數字。
本題主要的思想是動態規劃,方程很容易得出,時間複雜度O(nm*10)。可是
本題有兩個難點:
(1)如何獲得最大的數字?標準的方法是使用BFS,搜索的過程當中必須很是注意
搜索的順序,可是這樣實現很容易出錯。我注意到了n<=100 的條件,所以結果不
會超過50 位,因而我使用3 個int64 來保存結果,這樣既實現簡單又不容易錯。雖
然程序常數比較大,可是不至於致使超時。
(2)不能不使用火柴棒,而數字0 也須要火柴棒來拼成。例如n=5,m=97 的結
果是-1,而n=6,m=97 的結果是0。
ACM 比賽的第一題的選擇對比賽的進程影響很大,這次比賽很成功地使用了
很穩妥的算法。
E:標準的課堂睡覺問題,求最先全部人不睡覺的時間。
簡單的模擬題,並且時限很寬鬆。
E 實際上是最簡單題目,可是因爲個人低級錯誤,不只獲得了一次罰時,並且浪
費了寶貴的時間。好在當時比較冷靜,很快改正了錯誤。
D:對於一個不超過100*100=10000 的表達式,能夠在其中加入*來表示任何
字符,若是一個表達式只能和惟一的等式對應,則稱爲A 類表達式。給定一個表
達式B,要求經過改變最少的字符使它變成A 類表達式。
本題使用了一次搜索再檢索的方法,能夠有效控制程序的速度。估計時限問題
後選擇先提交節省了很多時間。
J:給定一個4*4 的網格的邊框圖形,問是否能夠經過在4*4 的網格上放6 個
2*2 的正方形框獲得。
H:給定一組旋轉後的曲譜及初始音符及結束音符,求原始的音符序列。
開始胡偉棟沒有看到旋轉的角度是整數的條件,因而推出了能夠解決實數角度
的數學公式。可是因爲公式須要考慮的狀況比較複雜,幸運的是咱們使用了枚舉角
度再判斷的方法。
寫了讀入部分以後,看到Panacea 過了H 題。鬲融從新讀了題目,發現了角度是整
數的條件,因而稍微修改就獲得了正確的程序。
本題須要判斷的條件不少,須要考慮得很仔細:
(1) 先把座標按照X排序。
(2) 經過初始音符及結束音符獲得sd,判斷sd 是否在1 到5 之間。
(3) 判斷相鄰兩個字符的距離是否在sd 到5sd 之間。
(4) 判斷每一個點的座標是否能夠對應一個音符。
F:求3 維空間的Voronoi 圖,輸出每一個Voronoi 塊體積佔的比例。
胡偉棟提出了本題的正確算法:分割立方體。若是一個立方體的8 個頂點都到
一個點最近,那麼這個矩形內的全部點都到這個點最近,不然就分割這個立方體,
直到立方體的體積少到必定程度爲止。
開始程序的精度不夠,後來胡偉棟提出了一個啓發式的分割立方體的方法,思
想就是使得兩個立方體的分割面以儘可能大的機率穿過Vorinoi 平面。程序的效果很
好,並且那時時限也已經放寬,因而順利經過了F 題。其實本題蒙特卡羅法也可
以過,咱們也想到了這個方法,可是因爲隨機過程寫的效果有問題,致使精度不夠。
經過F 題的時間是270 分鐘,封版時除了Panacea 經過4 題,其餘隊伍最多隻
有3 題。當時Panacea 正好坐在咱們背後,很惋惜他們卡在了D 和G 上,最終也
只有4 題。最後半小時咱們也沒有嘗試H 或者A,由於其餘隊伍很難在最後一小
時經過4 題。咱們就簡單嘗試了幾回C 就默默地等待着西安賽區比賽的結束。
最終咱們經過6 題排名第一,因爲已經得到了上海賽區的冠軍,不參加ICPC
的排名,不過仍然得到了Solaris 杯。
總結:
西安的ICPC 冠軍是北京大學的T2(rainer,dzx 和cici),後來他們依靠西安
的奪冠成績進入了2007 年的全球總決賽。T2 在最後一小時表現極其神勇,順利通
過2 題一舉超過了GotoFly 和Panacea,並且最後幾分鐘還頗有但願經過H,賽後
和rainer 討論以後發現算法相差無幾,可能就是一些小細節缺陷吧。2006-2007 年
度的ACM 比賽,從上海到西安,還有東京的總決賽,Mobile Robot 每次比賽都能
看到了T2 熟悉的身影。咱們在封版以後經常因爲壓力較大很難攻破題目,他們在
封版以後的冷靜心態很是值得咱們的學習。
GotoFly 與T2 同樣經過5 題,因爲5 分鐘的罰時劣勢位居第三,Panacea 經過4
題依靠罰時優點排在第四。兩隊都欠缺一些運氣,很惋惜。另外印象很深的是,坐
在對面的朝鮮隊經過了4 題在ICPC 中排名第2,若是西安可以多一個名額的話,
他們就可以出如今總決賽賽場了。
西安賽區是Srbga(劉汝佳)出的題目,從高中時期就開始作了Srbga 出的題
目,西安賽區的題目又一次體現出了劉汝佳命題的許多重要特點:
(1) 若是Srbga 大哥出是一套題目,那麼你會明顯以爲題目拿在手上明顯重一
些。Srbga 大哥出題很重視題目描述或者故事的完整性,他不多使用一些僵
硬的題目模型和描述。有時讀着他出的題目更像是在讀小說,欣賞故事。
固然,因爲Srbga 大哥出的題目描述完整,剛拿到題目的時候會感受很難
上手。咱們很容易發現沒有一道題目容易上手。用數據表達,比賽開始時
的空機時間偏長。
(2) Srbga 大哥出的題目和世界總決賽的題目風格近似,題目多半對編程能力
提出很高的要求,相比之下對算法的要求不是很是高,考察的都是比較基
本的算法。若是用一個字形容就是:野。
(3) Srbga 大哥出的題目對算法的考察範圍很是廣,雖然對於某特殊的算法要
求不高。有時還須要很強的組合算法能力。
(4) Srbga 大哥出的題目中很注意數據的設計,例如C 題中特別生成了極端的
狀況,J 則使用了接近20000 組數據。通常狀況下,不通過精心設計的隨機
算法會吃盡苦頭。
2006 年的Mobile Robot 的ACM 分區賽比賽任務已經所有結束了,2006 對於
Mobile Robot 來講是豐收的一年,咱們圓夢了上海和西安的雙冠軍。在隨後的冬天,
咱們加緊訓練準備東京的總決賽。
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個
回顧。回顧了GCJ2006 和2005 年的ACM 以後,轉向TopCoder 的比賽吧。我參加
的最先的TopCoder 賽事是TCCC2006。
TCCC2006——死亡之組
TopCoder Collegiate Challenge(簡稱TCCC)是TopCoder 通常在秋季舉行的面向全
世界在校學生的程序設計大賽,2006 年的TCCC 在聖地亞哥舉行。從北京到舊金山
的飛行只須要11 個小時左右,因此不至於那麼疲勞。路上一切都很順利,很感謝
OpenGL 的提醒,對於超過8 個小時飛行自帶拖鞋和枕頭對我來講仍是很重要的。
TCCC2006 使用的標準的TopCoder 現場比賽形式,比賽有48 名選手參加,首
先48 名選手被分爲16 我的一組,每組分別進行半決賽,前2 名直接晉級決賽,3-
6 名晉級wildcard 比賽,wildcard 比賽12 人中的前兩名填補決賽的最後2 個名額,
決賽由8 個選手參加。TopCoder 現場比賽中很重要的一個創新是:每名比賽選手
在觀衆席前都有一個同步的顯示器,這樣觀衆能夠看到選手任什麼時候刻作的事情,極
大加強了互動性。
TCCC2006 的Room 1 和後面的Final Round 均可謂是死亡之組。如今就回憶一
下這兩場激烈的比賽吧。
Room 1:
至於3 個房間的分配,TopCoder 按照註冊截止時選手的Rating 分佈蛇形分配。
可是TCCC2006 的房間實力分佈極不平衡,我與上屆冠軍tomek,著名選手reid,
Egor,halyavin 還有Rating 不高可是實力極強的Ying 和ardiankp 同被分到了Room
1,賽前Room 1 成爲公認的死亡之組。
在聖地亞哥,我和師兄Macsy(張一飛)同一個房間,很感謝師兄的關心,我
那幾天休息的都很好。要知道若是同房的人有10 小時左右的時差的話,一人必須
很當心才能保證不影響另外一人的休息。
Room 1 在我抵達美國的次日早上進行,選手容許提早30 分鐘準備一些必要
代碼。不過如今你們都比較喜歡學習Petr 那樣一行代碼都不打。下面就是比賽的
過程:
250 分題目是:給定n(n<=50)個整數AI 和一個閾值d,計算n 個整數全部排列
PI 中知足|API-API+1|<=d 的排列中,全部不一樣可能AP1 的個數。這題最標準的方法是
動態規劃,基本思想是把n 個整數排序以後,計算兩條相鄰元素不超過d 的序列。
我使用了一種更精巧的算法,把n 個整數排序以後,對於AI,若是AI 可能做爲排
列的第一個元素,那麼AI 一定在某一個方向(大小)連續而在另外一個方向每間隔
兩個元素相連。這個算法比較容易實現,可是正確性證實比較難,甚至讓人第一感
覺是錯的。我寫完程序測試了全部樣例都正確就提交了,243 分。提交以後我又測
試了許多數據,並在紙上嘗試證實正確性。
賽後,我看了網絡上的討論記錄。在我提交250 分題以後,馬上遭到了misof
的懷疑,他認爲個人算法有問題。據Macsy 學長的回憶,OpenGL 在我屏幕前看我
寫完程序,也認爲個人算法是錯的,不事後來他們討論以後發現沒有反例。
關掉250 分題目以後,我剛剛意識到Room 1 的3 題分數不是250-500-1000,
而是250-600-900。如今看來,對於250 比較順利的狀況,應該先作500,若250
不順利或者想出奇制勝的話,能夠先開1000 分。當時沒有什麼經驗,我認爲900
比600 應該簡單一些,因而就打開了900。
900 分題目是:給定一張n(n<=10)個點的帶權有向徹底圖(也就是n2 個實數)
和一個衰減係數p,求一條通過d(d<=10)條邊路徑(不須要保證簡單路徑),要求
這條路徑的指數衰減長度(指數衰減是指第i 段的長度乘以pi-1 而後求和)最接近
1000。這題若是使用窮舉法,就須要1010 左右的計算量,在TopCoder 的測試機上
也不能經過,因爲路徑長度很容易超過1000,因此很難找到多項式時間的動態規
劃。我立刻有了一個想法——雙向搜索。對於長度爲d 的路徑,其實能夠看做從
某一個點p 出發的一條反向的長度[d/2]的路徑和一條正向的d-[d/2]的路徑,對於
固定的節點v 來講,這種兩個方向的路徑都不超過n[d/2],這樣只要枚舉一個方向
的路徑而後二分查找另外一個方向便可。複雜度是O(dn2+[d/2]) 。
現場比賽調試環境不是很好,我花了很多時間調試以發現程序中的錯誤。提
交以後690 多分,還不到700。不過對於900 分的題目在那種壓力下還能夠接受。
提交以後我花了15 分鐘左右測試,沒有發現錯誤。因而就準備作600 了。
600 分題目是:一道經典的數學題,給定一些盤子疊放的規則,計算頂層盤子
的最大可能大小。其實算法不是很難,只要二分頂層盤子的大小,而後依次貪心計
算來判斷底層是否可以知足便可。只是貪心的時候要考慮兩種狀況,一時想不清楚。
我當時已經感受很疲勞,思路不是很清楚,最後40 分鐘時間也沒能調試經過。這
題過於瑣碎,Room 1 中最終沒有選手經過600 分題,而且成就了一個刺激的
Challenge 階段。
Coding 階段我和tomek 採用了大相徑庭的策略,我跳過600 直攻900,而
tomek 在600 中掙扎了很長時間才放棄。Coding 階段結束時,有4 名選手提交了3
題。我依靠速度優點領先一樣提交250 和900 的tomek 35 分左右。
Challenge 階段開始時,我盲cha(blind challenge)了一個最後時刻提交的900
分程序,可是因爲我選擇的數據實在太弱,失去了25 分。這樣我和後面的tomek
只相差10 分左右了,因此我決定只要tomek 不動,我也不動了。其實,當時
tomek 已經知道本身的900 是錯的,Challenge 階段他估計已經放棄了。個人
Challenge 階段最終就以-25 分結束。
以後的Challenge 就是Ying(王穎)展示勇氣和智慧的舞臺了。他Challenge 掉
了全部提交的600,憑藉225 分的加分超過了我,排在榜首。這樣比賽的形式也一
目瞭然了,7 位選手提交了900,我依靠速度優點領先第四名reid 超過100 分。只
要我兩道題目可以Passed System Test 就足以進入Final Round 了。
System Test 以前,我和Ying 討論他「超神」的Challenge 階段。這是我第一次
參加TopCoder 的現場比賽,發現System Test 結果顯示是按照System Test 以前的
排名倒序進行的。測試到我時,除了tomek 的4 名選手的900 都過了。顯示個人
結果時,兩個綠框閃爍了好久終於顯示出了兩個大大的鉤,我終於能夠歡呼慶祝勝
利了。我前面的Ying 也兩題全過了。這樣咱們兩位中國選手得以在死亡之組攜手
出現,這場比賽真可謂是中國選手的勝利。Reid 只能在Wildcard 賽再做努力,
tomek 則被直接淘汰出局了。
Final Round:
接下來的兩天裏,我觀看了Room2,Room3 和Wildcard 的比賽。第2 天晚上
咱們參加了TopCoder 贊助的Laser Tag 遊戲,咱們全部中國人組成了一隊,個人發
揮不好,緣由是這個遊戲與CS 不一樣,選手頭上沒有感光器,而我喜歡遇到人就攻
擊頭部,因此狹路相逢多半是我失敗。活動中,我有幸結識了許多Dev 的神人,
當時因爲vividmxx 沒有參加,magicpig 和PE 的競爭很激烈,最終PE 得到了「浙江
大學建校100 年來第一個TCCC 冠軍」。記得賽後我uncle 來到現場,我uncle 是
浙江大學本科畢業的,magicpig 見我uncle 第一句話就是「浙江大學建校有100 年
歷史了吧?」汗死了。另外zjq 也得到了Design 的亞軍。
第三天中午Championship Round 開始了。決賽時,場地裏安裝了不少攝像頭,
能夠說咱們的任何舉動都在嚴密監視下了。這回我提早確認了題目分數是標準的
250-500-1000 的分佈。參加決賽的選手除我以外有:andrewzta,ardiankp,bmerry,
Eryx,mathijs,Petr 和Ying。面對決賽選手的實力,我已經沒有意義定一個相似於
「保幾爭幾」的目標了,努力發揮本身的水平是最應該作的。下面就是比賽的過程
了:
250 分題目是:給定n 個正三角形,每一個頂點都有數字,選出6 個三角形拼成
一個正六邊形,要求相鄰的數字必須相同。三角形容許旋轉,計算可以獲得多少個
本質不一樣的正六邊形。題目很長,我仔細讀了兩遍纔開始寫,算法很清楚,就是枚
舉六邊形中心和四周的7 個數字,而後判斷是否有足夠的三角形。在判斷本質不
同的時候犯了一個錯誤,調試了幾分鐘,提交以後只有215 分了,看了一下排名,
Petr 有232 分之高,其餘選手都尚未提交。測試了幾分鐘發現程序的運行時間不
是很穩健,很容易到達0.8 秒左右,測試了15 分鐘之多才逐漸放心下來,由於基
本上全部數據都0.8 秒左右。賽後Macsy 告訴我,個人程序速度瓶頸是在set 的判
斷,因此時間比較穩定,不會超時。我當時的猶豫和沒有經驗浪費了至少20 分鐘
的時間。
按照賽前的計劃,我這時應該打開1000 的題目的,可是因爲本身對250 沒有
信心,並且求穩思想比較重,我先打開了500 分的題目。如今看來,開500 分的
題目並不算錯誤,其實在打開500 分題目的時候,與Petr 的差距不是很大。
500 分題目是:給定一個機器人的移動命令序列,要求計算結束時機器人的位
置。因爲移動序列中容許()這樣的重複操做,直接模擬是超時的。這類題目的標準
算法是利用矩陣乘法,因爲以前對於此類題目沒有經驗,沒有準備好就開始寫了,
致使矩陣處理失敗。我果斷放棄了調試,換用一種記錄中間結果的搜索方法,寫完
的時候已經只有280 分了。更重要的是我已經沒有時間進攻1000 分了。提交以後
排在第3,前面是Petr 和Eryx。
1000 分題目是:給出一個排隊取菜的模型,計算一個等待時間的排隊序列。
並且對於多種答案的狀況,要求計算字典序最小的序列。題目其實不是很複雜,集
合動態規劃就能夠解決,不過模擬取菜過程時須要很是注意細節。Petr 提交了一個
660 分左右的程序,Ying 則在最後一分鐘提交了400+分,排在第2。
Challenge 階段顯得很枯燥無味,前兩天大發神威的Ying(+225)和Petr
(+300)都沒有嘗試Challenge,整個Challenge 階段沒有任何一個Successful
Challenge。
System Test 結果出來了,在bmerry,ardiankp 和andrewzta 都只經過一題的結
果出來以後,排在我後面的mathijs 兩題都Pass,隨後個人250 和500 也都Pass 了。
可是,排名在我以前的Eryx 和Ying 的500 分和1000 分都Failed System Test 了,
我瞬間提高到了第二名的位置。不過雖然Petr 的1000 分掛了,可是他依舊憑藉
250 和500 的速度得到了冠軍。
在這裏說一下1000 分的真實狀況吧,由於這些時間來對於TCCC2006 Final
Round 的1000 分題目有不少不一樣的說法。比賽結果中顯示沒有選手經過1000 分題,
若是仔細分析測試結果,Petr 的程序因爲超時出錯,而Ying 的程序因爲一個地方
沒有清0 而致使錯誤,確實很惋惜。由於若是Ying 的1000 可以Pass 的話,他將
是TCCC 的冠軍。不過Ying 的算法犯了與形成Petr 超時同樣的錯誤,他們的動態
規劃程序比標準方法多出一個n 倍的時間,我曾經成功生成了一個用例,可讓
Ying 和Petr 的程序都超時,這個例子已經獲得了Ying 的承認。須要指出的是
TCCC2006 是TopCoder 的測試機的速度仍是很慢的,兩個程序若是在如今的機子上
運行可能只須要1 秒左右了。
比賽以後和uncle 到downtown 遊玩了一下,參加完頒獎晚會,次日就回國
了。
總結:
TCCC2006 是我第一次參加TopCoder 的現場比賽,頗有幸可以在這麼多的第一
次中就進入決賽而且得到第2 名的成績。很感謝同參加比賽的同窗Macsy,
OpenGL,Ying 還有PMH 的關心和幫助,大家在我比賽時全程在場邊,讓我感受很
溫暖。
另外,我還有幸認識了visualage,如今他已是arena 的負責人了吧。記得他
和OpenGL 在Room 1 的Challenge 階段經過大聲叫中文(在國外,這是最好的密碼)
告訴我tomek 的900 是錯的,惋惜我沒有聽見。
TCCC2006 對於中國來講是不小的收穫,中國選手佔領了Dev 比賽,PE 得到
「浙江大學建校100 年來第一個TCCC 冠軍」,magicpig 和zjq 分獲Dev 和Design
的亞軍,也就是說中國包攬了全部亞軍。在比賽之餘,我很高興認識了衆多
TopCoder 的朋友。
Petr 在決賽中表現了很是良好的狀態,TCCC 的奪冠標誌着Petr 收穫了2006
年的大滿貫。Ying 也採用了很合理的策略,只惋惜他的賭博因爲運氣差一些惜敗。
我採用了比較保守的策略,在全部決賽選手中排名第2,這也是我在TopCoder 的
現場賽事中的最高名次了。
TCCC2006 我很感謝家人的關心,父母凌晨很早起牀查看個人比賽結果,而
uncle 還特意趕來現場爲我加油。這幾年的TopCoder 現場比賽的贊助商列表裏都能
找到American Online(AOL)的身影,TCCC2006 是AOL 惟一一次進行了3 個小時左
右的全程直播,父母和uncle 都在網絡上觀看了現場的影像直播。
TCCC2006 我神奇地保持了100%的正確率,我我的認爲TopCoder 現場比賽對
正確率提出了更高的要求,咱們沒必要太在乎Coding 階段的那些高分,只要本身的
程序是正確的,就是成功的。
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個
回顧。首先是GCJ2006 的回憶。
Google Code Jam 2006
一波三折:
Google Code Jam 2006 是我第一次到美國參加現場的程序設計比賽。Google
Code Jam 2006 的比賽地點設在了紐約,此次紐約之行以前的簽證出了不小的問題,
這裏很是感謝你們對咱們的關心,特別感謝吳總(wyy)和魯小石的幫助,使我最
終踏上紐約之旅。
從北京到紐約的飛行時間是13 個半小時,因爲是第一次作超過8 小時的飛機,
沒有什麼必要的經驗和準備,路途很是疲勞。一到賓館就睡了,結果因爲手機鈴聲
的時間使用的是東方時間,差了12 個小時,一覺把全部事情連晚飯一塊兒都睡過了,
隨便吃點東西就繼續睡了。以後的全部現場比賽我都養成了提早睡覺的習慣,以保
證充足的體力。
比勝過程:
比賽時精神狀態還算能夠,可是分配了比賽房間以後發現本身和tomek 分在一
個房間,真是很不爽;在和旁邊的zhuzeyuan 抱怨的時候,發現他和Petr 一個房
間,彼此彼此吧。
下面就是比勝過程了,整體來講比勝過程比想象的艱苦,不過其實在System
Test 以前的結果仍是很滿意的,先簡單描述一下3 道題目吧。
250 分的題目是一道平面極值問題,給定n 個點,求一條直線,使得n 個點到
這條直線的y 方向截距總和最小。我回憶起金凱在2003 年集訓隊論文中報告中講
到的很相似的一道題目,記得一個重要結論是這條直線必定通過兩個點,雖然題目
有些不一樣,可是很快獲得了相同的重要性質:這條直線必定通過兩個點。這樣很容
易獲得一個O(n3)的算法。
500 分的題目是一道反Hash 函數問題,給定一個Hash 函數和x,求一個最小
的非負數y 使得H(y)=x。估計了一下,單向搜索須要26^8,因而我改用雙向搜索,
這樣就變成了26^4。可是實現過程比想象的複雜不少,提交了後只有280 左右了。
其實,這題有更簡單的數學方法,tomek 的程序有450+。
1000 分的題目是涉及卷積函數和計算反函數的問題,經過轉化變成線性方程
求解問題。當時受到現場氣氛的影響有些緊張,浪費了很多時間,提交以後550
分左右。其實,當時一些原理問題都沒有想清楚,不事後來和Ying(王穎)通過討
論驗證都是正確的。
Coding 結束以前Petr,tomek,Ying 和andrewzta 都提交了3 題,其中Petr 領
先得比較多,我和其他3 人差距50 分之內。
Challenge 階段開始以後,我因爲500 分題本身使用的是雙向搜索的算法,沒
有注意到有些單向的搜索加模線性方程的方法實際上是正確,在10 分鐘之內cha 錯
了2 次。落後於上述的4 我的,排在第五。
可是下面的5 分鐘發生了戲劇性的一幕,首先是Petr 的250 被cha 了,接着
Ying 的250 也被cha 了,這樣我面臨這樣一個狀況:tomek 領先我100+分,
andrewzta 領先我30+分,因爲我和tomek 處在一個房間,因此我作出了一個大膽
的決定,就是challenge tomek 的1000 分題,我隨機生成了一個隨機大數據,在最
後時刻提交了這個challenge,系統返回了一個使人窒息的結果:successfully
challenge。憑藉這50 分我一舉超過了tomek 和andrewzta,在System Test 以前佔
據了榜首的位置。
戲劇性的結果:
我頗有幸可以在第一次參加現場比賽時,就可以和冠軍這麼接近,若是System
Test 可以所有Pass 的話,這能夠認爲是一場完美的比賽。
但是,整個故事就好像是被刻意設計的同樣,System Test 以後的結果使我目瞪
口呆:首先是250 分的題目,我因爲有一個地方沒有及時使用double,而形成整
數越界;而後,1000 分的題目簡直是悲劇的最高境界,我在高斯消元的時候沒有
及時把一個重要變量暫存,致使影響告終果,沒有想到居然躲過了那麼多大數據,
可是不能經過System Test。最後排在50 名左右。這兩個錯誤至今刻骨銘心。
最終Petr 得到冠軍,Ying 亞軍,andrewzta 因爲500 掛了排在第3。
11 月的紐約有些冷,我隨大隊人馬一同去了一趟帝國大廈,景色很迷人。第
二天休息一下後與幾個中國選手打了一會「找朋友」,第一次美國之行就結束了。
總結:
比賽結果雖然不是很理想,可是對於第一次參加世界比賽的我還算能夠接受。
也算是爲從此的比賽留下一些教訓吧。
在帝國大廈上見識了你們的拍攝功底,我因爲技術差沒有拍到任何合適的照片。
在比勝過程中,首次見識了liympanda 的大將風度,和panda 在一塊兒老是笑口
常開,他不管遇到什麼狀況都無所畏懼,這一點我一直在努力學習,不過一直作的
很差。可是panda 打牌的時候就不同了,老是喜歡偷看別人的牌,還炫耀本身
會說廣東話,被Ying 和rocking 兩位廣東選手狠狠鄙視了一番。
Petr 加上以前的TCO 和以後的TCCC,拿到了2006 年的大滿貫,能夠算是歷史
性的突破吧。Tomek 有些惋惜,比完了還問我怎麼cha 他1000 分的,呵呵。
其實此次比賽Ying 挺惋惜的,其實Petr 的發揮並不很好,若是Ying 運氣再好
一些的話,歷史從那時就要重寫了。不過Ying 仍是體現了他超強的數學功底,讓
人佩服。另外,來自復旦的同省隊友LemonTree 也得到了好成績。
這好像是本身最後一次和xreborner 同場競技了(因爲以後xreborner 退役了
很長時間,忘記GCJ2008 咱們又見面了,謝謝Savior 的提醒),感謝您在我高中
時期教授了我許多編程技巧,我一直沿用至今。
附比賽排名:
Handle Score
Petr 927.02
Ying 811.21
andrewzta 761.56
halyavin 732.46
tomek 677.55
tomekkulczynski 634.69
pashka 590.05
asaveljevs 579.60
ainu7 552.23
misof 537.19
Egor 534.19
xOberon 517.65
reid 516.23
bmerry 498.01
LemonTree 497.27
MikeMirzayanov 490.32
PaulJefferys 481.89
monsoon 478.60
Andrew_Lazarev 475.39
tsjoker 454.86
kalinov 440.75
pparys 440.41
dyatlov 420.64
Michael_Levin 419.19
daveagp 403.39
malcin 399.55
kalmakka 397.15
kedaizd 391.91
cyfra 389.02
Macsy 387.38
Psyho 377.22
mhchan 374.90
jakubr 353.71
overwise 330.73
kia 283.48
ACRush 282.62
JongMan 261.44
IvanRomanov 251.33
DmitryKorolev 235.14
Revenger 234.54
elizarov 233.79
evgeni 232.44
antimatter 226.70
CatalinT 226.15
Jan_Kuipers 225.73
krijgertje 225.11
wd.h 221.28
w_ 218.82
zhuzeyuan 217.09
falagar 212.75
MegaS 210.88
gawry 209.13
liympanda 207.74
hyyylr 206.37
skatou 205.00
Vintik 204.09
jasonw 199.82
darnley 199.59
NPermyakov 199.54
aengus 196.67
embe 191.62
Yarin 186.89
NSI 185.22
AdrianKuegel 182.40
nicka81 181.01
HeaDacHe 178.77
VitalyGoldstein 178.37
kappa 175.40
HilbertRaum 168.29
DmitryKlenov 168.26
Abednego 165.51
Rocking 164.38
Per 163.41
Emilian_Miron 158.22
Aidin.Kashigar 156.94
lukasP 156.00
grotmol 152.34
gevak 142.55
nhzp339 130.61
NauCoder 107.71
lazyboy 98.73
WSX 56.89
Snail 25.00
Masao 0.00
blackmath 0.00
.Invader 0.00
Mg9H 0.00
smsorin 0.00
Rostislav 0.00
nya 0.00
lyc1977 0.00
xreborner 0.00
goo 0.00
soul-net -25.00
wintokk -25.00
Ulan -25.00
Bankevich -25.00
madking -25.00
fpmc -25.00
Soultaker -25.00
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個
回顧。今天到了2007 年初的東京,回顧一下2007 世界總決賽發生的趣事吧。
ACM-ICPC World Final 2007——Mobile Robot 東京決戰
2007 年的東京ACM-ICPC 全球總決賽在櫻花怒放的3 月初拉開序幕。成立了一
年的Mobile Robot 憑藉2006 年ACM 上海賽區的冠軍,表明清華參加了這次ACM
盛會。
記得黃金雄教授在杭州2008 時說,ACM 總決賽的實力分佈由原先的美洲獨霸
逐漸轉向瞭如今的亞歐爭霸。2007 年,一樣來自亞洲的上海交大具備很強的奪冠
實力,歐洲2007 年雖然沒有頂尖高手Petr 和tomek 的參與,可是ACM 傳統名校
St. Petersburg,St. Petersburg IMFO,Warsaw,Saratov,Petrozavodsk 等都派出了極
其豪華的陣容。雖然在2000 年先後美洲隊伍成績不佳,可是近些年因爲衆多歐洲
選手的加盟,美洲MIT 等頂尖名校也在總決賽中表現得很是強勢。
記得,每次世界總決賽以前,TopCoder 的論壇上都會羅列出全部參加總決賽
的TopCoder 選 手名單。可是我不是很看重這些數據,由於在不少次與歐洲選手切
磋以後,我發現了本身與歐洲選手相比的一個重大缺陷:我參加各種賽事以來,起
初比勝過程中常 常受壓力的影響很大,很難正常發揮本身的水平。後來狀況有所
好轉,在大多數比賽中都能正常發揮本身的水平。但是,令我感到意外的是,許多
來自西方的選手在 巨大的壓力下,反而表現得極其興奮而能超常發揮出本身的水
平。來自西方的各隊,我相信他們只要達到了興奮的狀態,都擁有得到冠軍的實力。
去年上海交大總決 賽總結中,他們也提到了本身沒有發揮出應有的水平,而IMFO
即便在比賽壓力下仍然可以作出8 題,可見他們平時訓練實力之強。可是我以爲
現場比賽發揮受影響多是少數中國選手的壞習慣,可能不適合用一樣的思路分析
歐洲的頂尖高手。
抵達東京:
出發的前一天晚上,我仍然熬夜參加了TopCoder 上的SRM 比賽,居然是Petr
出的題目。當時我與Petr 的Rating 差距很小,當時我3 道題目都交出了很高的分
數,在System Tests 以前遙遙領先,可是500 和1000 分的題目都因爲一些很小的
粗心而失敗了。我也失去了在總決賽以前超過Petr 的大好機會。結果到達日本之
後的次日,吃早餐的時候,我就碰到了做爲教練來到東京的Petr,他一看到我就
扯前天比賽的事情,汗。如今回想起來,那場SRM 對個人總決賽之旅確實有不小
負面影響。
抵達東京以後才發現,全部隊伍中,只有咱們選擇了與全部志願者衣服顏色
相同的清華校色紫色,開幕式過程當中,許多隊伍都把咱們當成志願者了。
練習賽前一天的晚會很豐盛,大多食物都是中國風格的,水果也很是好吃。
晚會期間,我見到了衆多大陸學校的隊伍,當年大陸至少有15 支隊伍參加總決賽,
隨處能夠感受到說着國語的選手。同時還見到了許多TCCC 上出現過的面孔,隨後
發現ardiankp 也來參加了,咱們還聊起了ACM 在新加坡(ardiankp 是表明南洋理
工大學參加的)的狀況。相似總決賽這樣的比賽,我以爲選手之間的交流則更重要
了,由於每次總決賽都會集結衆多熟悉的ID 但陌生的面孔。晚一些以後,咱們與
北京大學的T2 一塊兒打牌,隊友geworm 和wd.h 都抽籤到了另外一方,他們的牌太猛
了,在加上我和李文新老師的牌都很差,結果咱們慘敗。
從正式比賽的前一天的中午開始,主辦方組織咱們遊玩當地的Disney 樂園。
日本3 月的景色很美,當地人也很熱情,惟一的缺點就是不管用日語仍是日式英
語都很難交流。咱們在Disney 樂園中主要以觀看錶演爲主,沒有參與過多的活動。
東京到了晚上有些冷,我嘴脣都有些結冰了,但是發現路上許多日本女高中生還穿
着裙子,仰慕。
正式比賽:
總決賽的隊伍是按照學校的音序排座位的,練習賽時咱們發現本身坐在來自
荷蘭的上屆亞軍Twente 大學旁邊,剛打招呼就發現他們3 人的最低身高也有190,
聽說荷蘭女子的平均身高也有180 以上,彷佛以爲本身是從小人國來的。
練習勝過程中,我已經絲毫感覺不到娛樂的氣息了,現場的緊張氣氛已經籠
罩了咱們全隊。全部隊伍都在抓緊一分一秒熟悉比賽環境,賽場中敲擊鍵盤的聲音
已經徹底覆蓋了觀衆鼓掌的聲音。比賽中使用的PC2 提交系統比想象得穩定,咱們
努力嘗試各類功能以熟悉機子上的編程環境。東京的總決賽使用了一個形狀奇特的
鍵盤,因爲當時早已養成了自帶鍵盤的習慣,此次總決賽中奇形怪狀的鍵盤對我編
程的速度影響很是大。
總決賽正式比賽在次日9 點左右開始,Bill 想盡各類辦法活躍氣氛,不過比
賽開始前幾分鐘現場仍是靜得可怕,比賽開始5 分鐘以後,現場就被鍵盤聲籠罩
直到結束。咱們回顧一下比賽的過程吧,底紋的文字是我比賽後寫下的總結:
此次World Final 的題目又基本由編程題組成,多是因爲比賽時不夠興奮,
比賽全程都很是不順利。
大概從2003 年開始,世界總決賽的題目風格已經徹底倒向以編程題爲主的特
點,對此咱們早有準備。不過因爲時差問題,還有幾天前SRM 比賽因爲錯兩題導
致Rating 跌停對我信心的影響,使我比賽中一直不是很興奮。不過比勝過程中,
咱們仍然堅決的採用前面提到過的經常使用組隊模式:
(1) geworm 全程負責讀題,思考算法和出數據;
(2) wd.h 和我在比賽前2 個小時一塊兒攻簡單的題目;
(3) 2 小時後wd.h 就開始死磕難題,我主寫程序一直到3 個半小時左右,結
合wd.h 對難題的把握,你們開始合攻難題。
25 分鐘:Problem A,簡單地枚舉。但是我生物沒有學好,沒有考慮父母基因
的順序問題,錯了一次。
比賽開始時,正常狀況我會從B-I 中間尋找容易上手的題目。但是因爲有些緊
張,直到geworm 給我翻譯A 題目內容時,我尚未讀懂任何題目,這種狀況不多
發生。
題目A 的描述,須要一些必要的生物知識幫助理解,但是這些東西我早已忘
記。geworm 花了很多時間幫助我理解這題,我仍是因爲沒有考慮父母基因的順序
WA 了一次。不過改過來以後,咱們居然是全部隊伍中第一個經過A 題的,可見當
時不少隊伍也沒有徹底放開。
43 分鐘:Problem B,最長上升子序列。開始算法沒有想好,莫名其妙地錯了
一次。
若是說題A 的WA 是生物問題,那B 的WA 簡直就是莫名其妙。B 就是最長上
升子序列問題,好像剛開始寫時我和wd.h 都沒有想清楚,寫了一個神鬼莫測的程
序,WA 一次以後才改爲正確算法。但是當時咱們都沒有想到的,總決賽中咱們隊
伍莫名其妙的WA 噩夢纔剛剛開始。
97 分鐘:Problem G,枚舉+模擬。這是很扯淡的一題,題目很容易看錯,我
們因爲看錯題目錯了兩次,等看到Twente 大學過了以後才重讀題目,找到了正確
的理解,浪費了大量的時間。
G 的題目描述確實不是很清楚,許多隊伍都發生了理解錯誤,咱們也不例外。
不過第2 次提交錯誤就不能理解了,當時也不知道出於什麼緣由又提交了第二次,
難道是想先搶一個提交冠軍嗎?當時咱們確實受到了開局不順利的影響,這樣作在
罰時自己就落後的狀況更是下雪上加霜。
146 分鐘:Problem F,BFS。其實這題是我發揮編程能力的機會,可是我開始
用了一個很奇怪的搜索方法,錯了一次才改用BFS 過了。
在G 題迷茫而放棄以後,我又嘗試實現了F。F 的第一次WA 是咱們Final 之行
的第三次「莫名其妙」了,我也不知道本身用了什麼一種奇怪的搜索方法居然過了
樣例,還立刻提交了,面對這種狀況我有些着急,表現得很不冷靜。好在geworm
及時提醒,我立刻改爲BFS 過了。在這期間,wd.h 已經實現出了I 題,並提交了一
次,結果是WA。
178 分鐘:Problem C,排序+枚舉。這題有一個陰險的地方,就是theta=0 的
狀況,還好咱們考慮到了,這也是咱們惟一一次AC 的題目了。
C 題的算法其實很是清楚,陰險的狀況咱們也考慮到了,我終於沒有再搞笑一
次,這也是咱們惟一一次AC 的題目了。從經過C 的時刻講,咱們的形式仍是頗有
利的,由於難度很大的I 咱們已經實現得差很少了。
224 分鐘:Problem D,數學題。這題本是一道很簡單的數學題目,可是不知
出題人怎麼想的,搞了一些沒有任何意義的東西,真是此次題目的一大敗筆。咱們
開始因爲沒有注意三點共線的狀況錯了3-4 次,而後因爲int64 越界又錯了3-4 次,
最後錯了7 次才AC。這題一共浪費了1 個多小時。
在BGF 各一次奇怪的WA 以後,咱們又徹底陷在了D 題的陷阱之中,若是順
利的話D 題只須要15 分鐘就能夠寫完,但是咱們忘記考慮了D 題中不少的陰險情
況,拖延了1 個多小時,貢獻了7 個莫名其妙的WA。但是,當時我並無想到,
這已是我AC 的最後一道題目了。
227 分鐘:Problem I,數學+模擬。這題是Jelly 寫的,有不少特殊狀況。
平心而論,我在總決賽上的狀態不是很好,編程速度受到影響,並且有10 次
以上的錯誤提交。最後咱們7 題的罰時高達1200 多,而上海賽區一樣7 題的罰時
只有700 多,從這一點上也能夠看出當時實在不在狀態。不過,wd.h 很好地執行
了咱們預約的組隊模式,順利完成了拖後中衛的角色。在我經過D 題以後,他改
正了I 程序中的最後一個bug。I 題最終也只有咱們和華沙兩支隊伍經過,但是說
是咱們最終可以得到亞軍的殺手鐗。記得在頒獎儀式以前,基本上全部選手見到我
都問I 怎麼作,我都統一回答:是胡偉棟作的。
咱們依靠I 題的AC 首次排在了榜首。比賽進行了227 分鐘,可以在200 分鐘
以後得到領跑的機會,我首次看到了奪冠的但願,上海和西安賽區的歡呼場面一次
又一次從我眼前閃過。當時只有華沙大學經過6 題,其餘隊伍都還不超過5 題。
但是幸福只持續了短暫的3 分鐘,咱們因爲罰時太多而被華沙反超,華沙大
學經過第7 題時華沙隊員的反應幾乎瘋狂,ICPC 的工做人員也用照片記錄了這一
時刻。
Problem E,咱們的算法應該是正確的:二分答案+最短路。可是不知程序犯了
什麼錯誤,沒有AC。
Problem H,很複雜的幾何題目,咱們的算法是:掃描。可是不知程序又哪裏
寫錯了,結果是WA,不是TLE。
雖然在接下來的73 分鐘時間內咱們沒有再過題,不過咱們仍然拚殺到了最後
一刻,拼盡全力而無怨無悔。不管是E 仍是H,咱們都想出了正確的算法,而且成
功寫完了程序,可是Judge 給出的結果一直是WA。咱們不斷測試數據,並修正了
一些bug,但仍然不能經過第8 題。在這種狀況下的穩定過題能力咱們確實特別沒
有訓練過,華沙可以經過8 題的超強實力確實很讓人敬佩。比賽剛結束時,Petr 還
特意趕來問咱們有沒有經過第8 題,ICPC 的工做人員碰巧留下了照片。
當時我很但願可以借他的運氣獲得一個Yes,不過PC2 仍是不斷返回WA 直到
最後。
後來,E 題就成了我寫計算幾何題目的一個巨大的心理障礙,直到2 個月前在
Proxima 的一次訓練中,在隊友的支持下,我終於成功經過了一個更強版本的E 題
(題目在UVA 上,題號是11425,這題至今2009.1 也還只有我和東京冠軍隊的
marek 經過)。
Problem J,這是一道很複雜的算法題目,如今我還不能證實算法的正確性。
更重要的是這題很容易實現一些看似正確的算法,可能沒有作這題是咱們此次比賽
的惟一成功之處。
I 的算法大體以下:
(1) X_i = the mininum cut between V_i and V_0.
(2) while (the graph is not empty)
{
(3) m = min(X_i).
(4) remove all nodes V_i whose X_i=m.
(5) let X_i = min( X_i , m+ the mininum cut between V_i and V_0 ).
}
(6) return X_1.
這裏提一個公開的祕密,最後顯示華沙大學的結果時,他們成功經過了E 題,
但是比勝過程中,咱們並無看到他們掛起藍色的氣球,不知道來自浙江大學或者
中山大學的選手能不能仔細回憶一下,當時大家應該坐在他們旁邊。
頒獎:
最終,華沙大學以經過8 題的成績得到冠軍,Mobile Robot 經過7 題總用時
1200 分鐘得到亞軍。整場比賽,咱們克服了開局的種種不利因素,成爲全場第一
支經過7 題的隊伍,亞軍也是一個很是可喜的成績了。因爲華沙大學不來自亞洲,
咱們同時也得到了亞洲冠軍。
頒獎儀式以後的表演很精彩,印象最深的要數那位「神偷」了,他在觀衆面
前不斷施展「妙手空空」,觀衆掌聲不斷。記得表演結束後你們等電梯時,那位演
員從咱們身邊走過,咱們都連忙確認本身的錢包和手機。ACM-ICPC 東京總決賽在
一片片掌聲中落下帷幕。
總結:
ACM-ICPC 總決賽結束後,Mobile Robot 又恢復了平靜。Mobile Robot 成立以來
共得到了兩個分區賽冠軍和一個總決賽亞軍,從那以後Mobile Robot 就宣佈解散
了,也許惟一的遺憾就是沒能得到一個真正的世界冠軍。賽後,黃金雄教授也來向
咱們祝賀,從他的言語中,咱們也感覺到了一絲揮之不去的遺憾。
東京總決賽的幾天裏,我有機會結識了許多國內外朋友,也是此次日本之行
的一大收穫。同時也感謝衆多ACM 選手一年來對咱們的關心和支持,當時bbs.pku
上留下了一個很長的帖子,讓我永生難忘。
在現場比賽中,我數次與歐洲選手直接交手,對他們的特色有必定的瞭解:
(1) 歐洲選手的編程能力很強,很適應總決賽現有的題目風格。有些歐洲選
手在notepad 裏寫程序,而後直接提交的事蹟絕非傳說。
(2) 歐洲選手對於算法的靈活運用能力強,可是對於一些比較深的算法瞭解
很少。例如這次總決賽的J 題。
(3) 許多歐洲選手的現場抗壓能力很強,即便在最後時刻仍然能夠發揮出自
己的水平。
在總結過復旦和Srbga 出題的風格以後,總結一下我理解的總決賽題目風格吧:
(1) Srbga 大哥出的題目和世界總決賽的題目風格近似,題目對編程能力提出
了極高的要求。相比之下大多數題目對算法的要求不高。
(2) 總決賽題目對算法的考察範圍很是廣,可是對於某特殊的算法要求不高。
(3) 總決賽題目的時間限制很寬,出題人很提倡一題多解。並且數據沒有想
象得苛刻,隨機算法有用武之地。
東京的總決賽已經結束快2 年,今年寒假結束以後,我又要準備踏上總決賽
征程了,但願此次咱們Proxima 能作的更好,將總決賽名次提升一位。
附Final2007 排名
Rank Name Solved Time
1 Warsaw University 8 1405
2 Tsinghua University 7 1200
3 St. Petersburg University of IT, Mechanics and Optics 6 866
4 Massachusetts Institute of Technology 6 866
5 Novosibirsk State University 6 868
6 Saratov State University 6 957
7 Twente University 6 1011
8 Shanghai Jiao Tong University 6 1026
9 University of Waterloo 6 1103
10 Moscow State University 6 1192
11 University of Auckland 6 1210
12 California Institute of Technology 6 1241
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個回
顧。最後是2008 年的杭州復出。
2008 年ACM-ICPC——杭州復出
2006 年ACM-ICPC 總決賽結束後,Mobile Robot 就宣佈解散了,也許惟一的遺
憾就是沒能得到一個真正的世界冠軍。宣佈退役ACM 以後,我並無徹底與ACM
絕緣,每次TopCoder 大賽以前 還經常作一些ACM 比賽調整狀態。記得08 年初,
我也全程觀看了總決賽,不過沒有想過復出。
杭州復出:
一 切事情要從一個zhuzeyuan 的電話提及,時間是11 月8 日晚上10 點左右,
當時我正在參加UVA 在線比賽而爲GCJ2008 做準備。 zhuzeyuan 在電話裏首先告
知我Loner 車禍的事情,好在如今Loner 已經痊癒了,當時確實很擔憂。隨後,
zhuzeyuan 向我介紹了 2008 年ACM 比賽的進行狀況,當時北京和哈爾濱賽區已經
結束。而後,邀請我加入Proxima 參加杭州賽區的比賽。我想當時答應的緣由主要
有3 個:
(1) 我 我的很喜歡Coding,雖然退出ACM 已經快兩年了,可是還常常參加個
人比賽。剛剛結束的GCJ2008 中國區半決賽,出人意料的奪冠加強了個人信心。
另外,ACM 這樣長達5 個小時的團隊比賽造就了很特別的環境,賽場上的氣氛和
激情是作裁判教練或者參加我的比賽中沒法體會到的。
(2) 3 年前的2005 ACM 杭州賽區,我留下了我大學生活中的一大遺憾。對於杭
州2005 的慘敗,我一直想尋找機會從那個跌倒的地方爬起來,完全擺脫紫金港校
區留下的陰影。
(3) 其實還有一個緣由就是我家在杭州,並且在本科期間我也曾經到杭州電子
科技大學作過關於ACM 的報告,lcy 老師的熱情給我留下了深入的印象。
對於Loner 的車禍,我也以爲很是意外。這也是對於咱們常年在校園騎自行車裏
橫衝直撞的警示。Loner 如今可以恢復得這麼好,咱們都很高興,祝你明年ACM
好運。
加入Proxima 的手續很順利,教練鄔老師對我復出想法的回答簡單扼要:研一
學生能夠參加ACM 比賽。
Proxima 的另外兩名隊友分別是zhuzeyuan 和zhouyuan(周源),我加入
Proxima 以後,新Proxima 前後進行了3 次訓練比賽,隨後就出發到杭州電子科技
大學參加2008 年ACM 杭州賽區的比賽了。
當 時,我經過許多網上資料和zhuzeyuan 的描述瞭解了當時清華的戰績。到
杭州賽區以前,清華的What’s Up 和IronGods 已經分別得到了哈爾濱和北京賽區的
冠軍。其中IronGods 還得到了哈爾濱賽區的亞軍,What’s Up 則一塊兒來到杭州參加
比賽。Proxima 在杭州賽區以前已經參加了北京賽區的比賽,成績是第二名。就當
時的形勢講,咱們沒有資格考慮太多事情,若是想 保留懸念就必須得到杭州賽區
的冠軍。
杭州賽區現場賽:
在杭州賽區練習賽那天的上午,咱們抓緊一切時間進行了模擬訓練,選擇的
題目是NEERC 的題目。題目難度有些大,咱們作滿整整5 小時,直到12 點50 才
急忙去吃午餐。結果很晚纔到達比賽場地,到時候練習賽已經開始好久了。但願我
們的遲到沒有影響旁邊隊熟悉比賽壞境。
杭電賽場的環境很好,在賽場裏我找回了2006 年上海賽區的感受。隊伍之間
的空間很寬敞,電腦桌也很大,足以讓3 我的在上面一塊兒推導公式。立刻就見到
了lcy 老師,不過他帶來了一個不太好的消息——不容許自帶鍵盤。好在杭電提供
的鍵盤很標準,對咱們影響不大。
正式比賽在次日早上9 點開始,回顧一下比賽的過程吧:
在Proxima 隊中,比賽開始時,仍然由我準備編程環境,而後從中間開始讀題。
我立刻發現了D 是一道看似簡單的題目,而且也注意到了這句話:
WARNING: a naive algorithm might not be sufficient to solve this problem.
可是沒有想到的是BFS 算法也算是naive algorithm,我交出了全場第一個提交,
結果是理所固然的TLE。不過那句WARNING 稍微有些飄逸。
zhuzeyuan 發現A 是簡單題目,因而我立刻寫A。
19 分鐘,A:判斷兩張圖的修改距離。枚舉全排列,統計便可。
A 是最簡單的題目,因爲開始D 的耽擱,咱們大概是全場第4 個出題的隊伍。
接着,zhouyuan 發現J 也很簡單,因而我轉向J。
28 分鐘,J:容許刪點的並查集問題。經過添加新點的方法實現刪點。
過了J 以後,排名暫時上升到第一位。隨後,zhuzeyuan 發現沒有新題可寫,
因而就開始寫C,過程當中,我和zhouyuan 發現G 比較簡單,因而插空寫G。
50 分鐘,G:簡單圖論問題。開始刪點判斷錯誤形成WA 了一次。
59 分鐘,C:高精度計算和素數斷定問題。這題是zhuzeyuan 寫的。
不到一個小時就經過了4 題,Proxima 得到了一個很好的開局。對於杭州賽區
難度的題目,可以在第一個小時經過4 題已經很順利了。對於許多分區賽中會出
現更多的簡單題目的狀況,有時可以作到一小時5 題。可是一小時6 題實在太難
了,記得咱們在一次訓練比賽中作到了一小時6 題,已是咱們的能力極限了。
接下來我實現了一下B,但是因爲發生了理解錯誤,計算結果與題目要求計算
的結果直接存在重複排列問題,只好把程序放在一邊。
隨後,zhuzeyuan 開始實現H,提交以後我開始寫F。
95 分鐘,H:計算幾何,若是使用O(n2)的算法須要注意常數不易太大。
105 分鐘,F:自動機判斷相等問題,經過計算差乘的方法可以在
O(n2*|Sigma|)內解決
H 的提交等了好久,H 的Yes 出來後不久我就寫完了F,提交以後也Yes 了。
大概在2 個小時左右咱們作出了6 題,其實若是不在B 上浪費時間可以更早一些。
在2008 杭州賽區,咱們又一次得到了6-4 的領先優點。
下面咱們面臨一個比較困難的情況,E 和I 看似都比較複雜,但明白題意的B
和D 都沒有想出算法。2008 年杭州賽區的題目中,基本沒有中等難度的題目,所
以咱們經過6 題以後就直接進入了比賽後期。當時咱們分了一下工,我決定死磕D
題,zhouyuan 負責推B 題的公式。zhuzeyuan 嘗試新題目E 或者I。
個人工做進行很不順利,先實現了一個普通的A*算法,因爲優化得很差仍是
TLE。如今回想起來,D 題標準A*算法中使用的那個優化仍是挺巧妙的,至少頗有
藝術感。我放棄A*算法以後,zhouyuan 彷佛已經推好了B 題的公式,開始幫助我
實現D 題。
163 分鐘,D:狀態最短路徑問題,經過A*算法加一些優化能夠輕鬆經過。
zhouyuan 提出了一個很重要的優化方法,先經過解方程的方法判斷是否有解,
在確認有解的狀況下使用雙向廣度優先搜索,程序寫好以後又TLE 了。不過我以爲
運行時間已經差很少了。因而,我使用了卡節點的方法,終於在第5 次提交經過
了D。D 題咱們用了大概一個小時左右。這時What’s Up 早已經過5 題,不過因爲
他們卡在H 題上,咱們仍然以7-5 領先。
zhuzeyuan 確認E 和I 比較複雜以後,咱們開始合攻B 題。zhouyuan 其實受到
了我原先錯誤算法的誤導,他獲得一些公式來計算繁衍函數,經過繁衍以及原先程
序的結果獲得正確結果。不過,從當時的形式看,這樣也是很不錯的選擇。
程序很快就寫好了,提交以後又是奇怪的TLE。B 題的TLE 和D 的TLE 本質完
全不一樣,B 題咱們算法的複雜度是O(n4)的,對於n<=20 的數據範圍,時間上應該
沒有問題。因而,我生成了100 組測試數據,發現總共只須要1 秒左右。
在B 題的這一點上,我以爲命題人作的很不合理,雖然此題存在O(n3)的算法,
可是既然把範圍出到20,就應該容許O(n4)的算法經過。但是命題人一共疊出了
6000 組測試數據,使得咱們的程序超時了。並且在Clarify 中的回答是1000 多組,
咱們優化程序以後仍是一直TLE,當時咱們怎麼會想到是6000 多。至少這裏的範
圍20 極具誤導性。幸虧,zhuzeyuan 及時想出了一個解決方法——打表。因爲對
程序沒有信心,打表的15 分鐘時間內咱們3 人都只得經過手工計算簡單數據來確
認程序的正確性。
236 分鐘,B:比較複雜的動態規劃,須要考慮4 種狀況。
打完表以後提交終於獲得了第8 個Yes,時間是236 分鐘,距離封版只有4 分
鍾。因爲6000 組的陰險數據,咱們從第一次提交B 題到經過B 整整用了50 分鐘,
並且是3 我的一直在一塊兒作。
封版時,咱們仍保持了8-6 的領先優點。可是接下來,咱們犯下了杭州2008
最大的錯誤,若是相似的錯誤在總決賽中出現,咱們將極可能失去領先位置。當時
咱們沒有看到港大掛起E 的氣球,因而在E 和I 中選擇了I,結果深深地陷在了I 的
無底洞中,直到結束都不能自拔。
I:模擬題,須要考慮的狀況比較多。
E:計算幾何。計算半平面的交。
如今回想起來,E 題的難度遠沒有I 題大,咱們錯誤估計了I 的難度。很是敬
佩賽場上經過E 題的港大和I 題的湖南大學,大家不愧爲射鵰英雄。
清華2008 戰況:
2008 年,清華延續本身在ACM 大陸賽區中的霸主地位, 4 支不一樣的隊伍得到
了創紀錄的4 個不一樣賽區的冠軍。分別是:
1. What’s Up——哈爾濱賽區冠軍
2. IronGods——北京賽區冠軍
3. Proxima——杭州賽區冠軍
4. ZCS——成都賽區冠軍
從ACM 的規則上講4 支隊伍都得到了進軍總決賽的資格,清華總決賽隊伍的
選拔過程在成都賽區結束的次日就開始了。
從個人角度描述另3 支隊伍的狀況吧:
What’s Up 是清華第一個得到冠軍的隊伍,杭州賽區的過程當中,他們以amber
主寫程序的模式進行,在比賽開始階段體現出了很強的衝擊力,不過卡住H 後的
慌亂略顯出組隊模式的缺陷。雖然他們在杭州賽區以後就選擇放棄了總決賽資格的
爭奪,可是咱們都深知他們的實力。後來What’s Up 的成員擔任了PK 比賽的裁判
工做。
ZCS 由剛進入清華學習的三名大一學生組成,成員是yuhch123,Cheryl 和
ScaleRhyme。我參加Proxima 以後沒有和ZCS 交過手,不過在Ural 和SGU 上比賽
時看到過ZCS 的身影。在杭州賽區以後,ZCS 在成都賽區創造了7/7(7 提交7 經過)
奇蹟,不過和北京賽區類似的是後期略顯經驗不足。隨後,ZCS 沒有參加校內PK
賽。
IronGods 的組成是OpenGL,ahyangyi 和ghy。在IronGods 成立之初,我一直
很看好這支隊伍。哈爾濱賽區結束後,記得ahyangyi 還來和我抱怨比賽中的失誤,
那道高精度題目確實有些過於複雜(呵呵,不過至少數據沒有錯誤)。北京賽區的
狀況,我是過後聽dzx 介紹的,IronGods 依靠最後一小時的穩定發揮,經過3 題,
一舉壓倒Proxima,Carriage 和ZCS 得到冠軍。但是幾天後,我驚奇的發現本身需
要面對強大的IronGods 了。
IronGods 的組合與新Proxima 驚人得類似,IronGods 的OpenGL 與ahyangyi 還
有我和zhuzeyuan 都是TopCoder 上的Target(中國一共有7 個Target,另外3 個
是前輩haha,lympanda 和ZCS 隊中的yuhch123,看好zhoujie 成爲第8 個,加油
呀!),他們的編程能力與我和zhuzeyuan 不相上下。從TopCoder 的成績上看,
咱們兩人的速度略快。
另外一名隊員ghy 和zhouyuan 都很擅長思考算法,ghy 結束OI 時間比較短,狀
態保持得很好,zhouyuan 對於深刻的算法瞭解比較紮實(北京的A 很贊呀!)。
從配合上說,IronGods 組隊時間長,配合方面比咱們默契許多。咱們重組後
雖然也進行了一些訓練,不過在比賽中廣泛交流偏少,特別是我和zhouyuan 的交
流,在後幾場比賽中才有些成功的配合。
不過從穩定性角度看,咱們稍占上風,TopCoder 上的Volatility 值至少能夠說
明一些。並且ACM 比賽時間長達5 小時,穩定性的要求應該比TopCoder 還高一些。
清華校內PK:
後來,zhuzeyuan 表明Proxima 與IronGods 協商以後,你們決定採用三局兩勝
的賽制,並定下了3 場比賽的時間和題目安排。
關於總決賽隊伍的選拔,我我的很是不同意直接指定,可能與個人一些經歷
有關吧。已經進入研究生學習的我,對參加總決賽已經沒有兩三年前的激情了。不
過我我的的觀點是,若是學校指定,我對於4 種結果均可以接受;若是進行PK 選
拔,賽場上我必定拼盡全力。
兩場PK 過程當中,咱們都在bbs.pku 上發佈了現場的即時排名狀況。因爲清華
ACM 團隊有嚴格規定要求對兩次PK 中使用的題目保密,我這裏就只留下了比賽的
大體過程。
第一場PK,時間和吉隆坡賽區徹底相同,過程大體以下:
Proxima 啓動比較快,到2 小時左右就得到了5:2 的領先優點。
題F 是這場比賽中咱們最大的失誤,F 浪費了不少時間,並且最後都沒有過。
IronGods 利用Proxima 卡住F 的時機連追4 題,以6:5 反超。
發現IronGods 反超以後,我又嘗試了幾回F 題,但仍是不能經過。比賽還有
70 分鐘結束,並且咱們手上並無其餘題目。zhuzeyuan 在關鍵時候毅然決定開始
寫J,記得他說的一句話是「沒有時間了,我必須開始寫了」,當時形勢不容樂觀。
好在J 成功1Y,士氣大振。
Proxima 隨後連過兩題從新佔據7:6 優點。
最後,IronGods 追成7:7 平,比賽又打得難解難分。
IronGods 最後時刻也還有機會,咱們又一次目擊了IronGods 的絕地反擊實力,
可能他們最後作H 的選擇值得商榷。
第一場PK 過程當中兩支隊都有明顯失誤的時期,咱們因爲失誤在中期,因此罰
時較少。最後依靠罰時險勝,在PK 中佔得先機。
第二場PK,時間設在12 月25 日的晚上進行,題目編號從A 到L,共有12 題
之多。第二場PK 比前一場進行得更激烈,過程當中兩支隊伍都長時間保持了很好的
狀態,比勝過程中屢次交換領先位置:
開局Proxima 起步略快,65 分鐘就經過了5 題BDEFK。
開局看似順利,不過咱們都明白:真真的比拼尚未開始。
Proxima 卡在了H 和C 上,IronGods 經過了BCDFK 追成5:5 平,罰時Proxima
領先。
IronGods 經過了G,首次反超6:5。
Proxima 通過rejudge 經過了H,出現了6:6 平,罰時Proxima 領先。
Proxima 第10 次提交才經過了C,再次得到題數領先7 :6。
若是輸掉了此次PK,題C 則是最大的敗筆。
IronGods 經過了J,追成7:7 平,IronGods 在罰時上領先。
此時的罰時落後就是Proxima 在C 題上出錯9 次的惡果。
Proxima 第4 次提交才經過G,以8:7 反超,但罰時仍是很大。
IronGods 經過了H,又追成8:8 平,利用罰時IronGods 再次得到領先。
這已是第6 次出現平分了。這時還不到3 個小時,校內PK 賽的題目難度並
不在2008 杭州賽區的難度之下,3 小時的8:8 的高比分平局是現場比賽中很難看
到的。而在高比分平局中罰時也是很重要的,此時IronGods 佔據明顯的優點。
Proxima 通過rejudge 經過了I,再次超出9:8。
Proxima 經過了J,優點擴大到10:8。
記得題J 的第一次提交開始的返回結果是「Other-Contact Staff」,看到這個回
復以後zhuzeyuan 立刻跑到Judge 室,在被工做人員擋住以後,zhuzeyuan 很奇怪
地問道「難道不是大家讓我來Contact 的嗎?」,囧死了。不過很快就rejudge 成
Yes 了,題J 的經過也從必定意義上逆轉了罰時的不利,IronGods 若是想翻盤就必
須在最後一小時從新上演北京賽區封版經過3 題一幕。
Proxima 經過了A,優點擴大到11:8。
記得最後提交A 題的時候,我緊張得手都有些發抖了。當時只剩下25 分鐘,
IronGods 尚未開始寫A 和L 兩題,因此在最後的時間裏他們已經不可能經過餘下
的4 題了。A 題的Yes 也就成爲了這場PK 的勝利宣言。
IronGods 最後時刻經過了I,最終題數爲11:9。
這次校內PK 的激烈程度決不亞於2006 年上海賽區,可以最終贏得這場PK 使
得咱們更有自信地站在總決賽的現場。
首先感謝關心咱們的同窗,記得第一場PK 當天正在舉行吉隆坡賽區比賽,
bbs.pku 上仍是出現瞭如此多的帖子爲咱們雙方加油。第二場PK 結束時已是晚上
11 點,咱們手機還不斷收到祝賀短信。
向IronGods 三位天王致敬,在PK 過程當中只需略微的變化,出如今斯德哥爾摩
的就極可能是大家。棋逢對手是我ACM 生涯的一大幸事,相信大家明年必定可以
作得更好。
我想這是清華第一次使用公開的現場PK 方式來選拔總決賽隊伍,我的以爲PK
的方式除了公平以外還有許多優勢。首先,PK 方式能夠使得各隊伍可以更從容地
選擇和準備不一樣的分區賽賽區,有效提升學校的整體成績。其次,經過PK 的過程,
能夠增強各隊之間的交流,隊伍各方面水平可以獲得全面提升。真是一箭雙鵰。
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個回顧,包括
今天一共10 篇。接下來的重要比賽就是世界總決賽了,縱觀世界總決賽各隊,雖然形勢不容
樂觀,但咱們必定會拼盡全力。
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個回顧。
回顧GCJ2006,ACM2005,TCCC2006 和ACM2006 以後,今天簡要回顧一下國內個
人賽場吧。
國內我的賽場——百度之星
國內我的賽場中最重要的比賽要數每一年一度的百度程序設計大賽,到今年爲
止已經舉辦了4 屆,每一屆我都全身心地參加了比賽的全過程,百度程序設計大
賽是中國舉辦的規模最大的公開程序設計比賽,其參加人數比許多世界範圍的程序
設計大賽的人數還要多得多。另外在2006 年初,Google Beijing 舉行了Google
Code Jam China 的比賽,剛剛開始參加TopCoder 的我也加入了此次GCJC 之旅。
第一屆baidu 程序設計大賽:
最先的國內我的程序設計比賽要回憶到2005 年9 月開始的第一屆百度程序設
計大賽了,源於宿舍走廊中的海報,我以嘗試的心態報名參加了第一屆百度程序設
計大賽。每一屆百度程序設計大賽都由初賽,複賽和現場決賽組成。
第一屆百度程序設計大賽中,印象最深的複賽題目就是那道規模巨大的最小
樹形圖問題了,100000 的數據規模嚇退了很多選手,我鼓足勇氣提交了一個理論
上可以運行的程序,順利經過了複賽進入決賽。最小樹形圖算法在大多圖論書上就
接在最小生成樹算法後面,可是其程序量遠比最小生成樹大,並且用途沒有最小生
成樹普遍,在大多數競賽中不多出現。我最先接觸最小樹形圖算法是在2003 年4
月,當時正在復旦大學訓練,記得關於這個問題和xreborner 討論了很長時間才得
以證實算法的正確性並實現出高效的程序。
現場決賽於2005 年10 月底在北京舉行,因爲當年比賽的知名度不高,時間
上還和GCJ 衝突,沒有太多的頂尖高手參加。清華大學除我以外只有superzn(張
寧,咱們留shell 一我的參加ACM 北京賽區預賽&#1048623;),當時OpenGL 仍是以高中生
身份參加的,還有復旦大學的xreborner 和young(李陽);中山大學的magicpig,
Savior 和張子臻(很差意思,我不記得您的ID 了,好像杭州2008 的時候咱們還說
起此事)。我一直認爲,現場比勝過程的一個重要的意義在於提供了一個老朋友重
逢和結實新朋友的機會,選手之間的交流是比賽中最重要的組成部分之一,我頗有
幸可以在這些比賽中認識了衆多牛人。
稍微回顧一下決賽的題目吧:決賽的題目是經典的8 數碼問題,給定初始狀
態和結束狀態,計算最短鬚要的轉移步數。對於分數相同的狀況,按照程序的運行
速度排名。比較容易想到的方法有:
(1) 單向BFS:最壞狀況須要1s 左右。
(2) 雙向BFS:若是先判斷無解狀況,這是xreborner 使用的方法,平均狀況
大概0.002 秒左右。
(3) A*或者IDA*:先判斷無解狀況,而後經過距離啓發函數搜索。平均狀況
大概0.002 秒左右。我當時使用了A*的方法,但許多地方的實現不是很合
理。
(4) 常量表,這是最有挑戰的方法,由於決賽的提交量限制在64K 之內。
現場比賽中,(2)和(3)的使用人數比較多,速度相差無幾,選手之間比拼的是
各類細節和常數的處理。後來,我想出了一種速度很是快的方法:
首先使用A*加上「卡節點」技術,就是限制A*算法搜索過程當中每層的節點個
數上限,這種算法擴展節點個數在100 左右。而後,因爲上述算法的正確性不能
保證,把全部反例打成常量,程序大概50K 左右。很容易發現,這個程序的速度
遠比比勝過程中全部程序的速度都快得多。
最終個人程序以總時間0.022 秒得到冠軍,xreborner 和Savior 以0.026 分並列
第二名。xreborner 的程序很惋惜,若是加入了無解判斷,速度應該比我程序塊,
superzn 就更惋惜了,superzn 的飄逸程序其實只有0.020 秒,可是有一個數據錯了。
記得頒獎以後,主持人邀請獲獎選手發言,選手能夠經過向前走一步選擇優
先發言。這時,我忽然感受你們把目光都聚焦到了我身上,向右一看,因爲我站在
最左邊沒有注意到右邊的狀況,可誰知其餘選手都後退了一步,把我留在了看似向
前一步的位置。
第二屆Astar-baidu 程序設計大賽:
第二屆百度程序設計大賽沒有等到10 月,而是在2006 年6 月就拉開序幕。
沒有想到的是,第二屆百度程序設計大賽居然以我在一年前比賽中使用的A*算法
的名字命名,感到很是榮幸。
記得複賽的題目很是正式,印象最深的要數xreborner 招牌式的Zuma,我推
了兩個小時公式才獲得了正確的動態規劃方程,實現以後還因爲TLE 只有30 分
(100 滿分)。還有Ying 出的無向圖最小割問題,我用網絡流算法又超時了。不過最
後一題,個人程序居然比xreborner 優化過的標程還快,真是不容易呀。清華的舍
友RealPlayer 在複賽中表現很興奮,惋惜因爲一個很小的錯誤沒能進入決賽。
參加第二次百度決賽的選手中有許多熟悉的面孔,清華的同窗包括shell,
OpenGL,lympanda 還有Macsy。復旦大學也來了不少選手,其中除了LemonTree
和Topkiller(沈毅)以外,還有我剛到復旦時見過的admin 和funny 的身影。另外
magicpig 和flymouse 也參加了,並且magicpig 和我住一個房間,吃飯時記得他把
桌上全部人的Dev 功底全都鄙視了一遍,惋惜PE 不在場呀。比賽前還看到了
Srbga 的身影,據他說是被邀請一塊兒來玩的,其實稍微用小腦判斷一下就知道必定
是參與出題的,有了Srbga 的加盟,相信決賽題目絕對不會是一年前的風格了。
第二年決賽的題目是:著名的俄羅斯方塊。寫程序玩一個10 列的標準2 維俄
羅斯方塊遊戲。
Srbga 設計了頗有特點的記分方法和評分標準。對於記分方法,特別的地方是
消去1 行後沒有得分,而同時消去2,3,4 行的得分分別是3,6,10,記分方法
很是鼓勵一次消去多行。評分標準則更奇怪了,有50 種不一樣規模的數據,對於每
組數據對全部選手的得分進行排名,前8 名的選手依次獲得10,7,6,5,4,3,
2,1 分,也就是說,是存在可能性在測試結束以後分數仍然爲0 的。
比勝過程中,我花了許多時間來分析這個奇怪的評分標準。
對於這種評分標準,常見的策略有兩大類:(1)全部數據的成績比較平均 (2)在
一種數據風格中特別突出呢。
根據數據描述,50 個數據能夠分爲10 種不一樣的風格。參加比賽的總共有50
名選手,若是全部分數是徹底平均分配的話,分數是31 分,這個數字意義不大。
但若是設想分數的80%會分配在前10 名中(根據當時選手的水平,這個假設仍是
比較合理的),這樣前10 名的平均分數是124 分左右,也就是說若是想擠進前4,
至少也要100 分以上,若是想爭取冠軍估計須要200 分左右。若是選擇一種策略,
使得它只在一種數據風格中特別突出,分數只有可憐的50 分,並且極可能有許多
有一樣想法的選手,因此(2)不太可取。
在決定選擇比較平衡的策略(1)的以後,須要再考慮一個問題,若是最終目標
是150 分,那麼平均分數只須要3 分,也就是說每一個數據能夠容許有5 名選手超
過本身。這些必要的分析幫助我明確了努力的方向,面對這種開放性的題目,多分
析題目的特色每每能夠達到事半功倍的效果。
還有一個重要環節是調整估價函數,機器學習實際上是一個很好的策略,惋惜
我當時不會。其實當時我作的事情,本質上就是人工模擬機器學習,手工調整了1
個半小時,眼都花了。並且我犯下了一個致命的錯誤,記得記分方法很是鼓勵一次
消去多行,也就是說對於平坦的數據,一次消去1-3 行的權值應該可能設置爲負數,
而我只把他們設成了0,使得程序對於平坦的數據分數不高。Macsy 就考慮到了這
一點,只惋惜一個很奇怪的技術問題(在Linux 和Windows 下的CLOCKS_PER_SEC
參數是不同大的,想使用卡時策略時千萬不能事先把這個數字取出來設置成
CONST)使得Macsy 沒能成功。
因爲Macsy 和LemonTree(一樣的技術問題)的出局,我在許多數據中獲得了
很高的分數,最後的總分達到了是255,領先了第2 名有99 分之多。其實現場的
許多選手的程序風格相差並不大,可能我惟一多作的事情就是創建了一個博弈樹,
多搜索兩層,這樣比直接貪心的程序看得更遠一些。後來事實也證實了,排名靠前
的選手大多都是比較平衡的策略。記得lympanda 洋洋灑灑寫了1800 多行程序,
在其中一種數據中拿到了滿分50 分。不過惋惜panda 的程序平衡性稍差,總排名
進入了前10,但最終只有三等獎。
第二屆astar-baidu 程序設計大賽,復旦大學得到了豐收。記得許多復旦的選
手因爲考試提早回到學校,頒獎儀式的時候二等獎頒獎一片空場。
比賽的住宿條件能夠用無與倫比來形容,很感謝baidu 的大方與細心。記得第
一天晚上還有機會和Ikki 一塊兒打沙壺球,面對球風徹底對立的Ikki 玩得很開心。
Google Code Jam China 2006
大概是2005 年底,忽然看到了名爲GCJC 的比賽,並且使用的是TopCoder 的
比賽模式,因而就報名參加了。當時估計只參加過幾場TopCoder 的比賽,賬號還
是藍色的,GCJC 第二輪預選賽因爲經驗不足差一點就被淘汰了。好在有驚無險地
進入到了北京的現場賽。
GCJC 現場的選手中,我以爲至少認識80%吧,清華同窗就有7 人:b142857,
fuwenjie,lympanda,Macsy,zig 還有hyyylr(李老師),復旦的LemonTree 和
TopKiller 也都來了,浙大也來了許多TopCoder 上的元老xuchuan(徐串),
sghao126。
記得,就在GCJC 決賽的前一天晚上,我參加了TopCoder 的SRM 比賽,第一
次踩住了Petr,不過也消耗了太多的RP。晚上的SRM 比賽中沒有人過3 題,第二
天早上lympanda 還把咱們通通鄙視了一遍。隨後,b142857 還描述他Challenge 過
程中的囧事,因爲500 分題目的返回結果須要使用long long 類型,因此b142857
看到一我的提交的程序計算過程當中只使用了long 就果斷Challenge 了,結果失敗了
兩次以後才發現,那我的用的語言是Java。
比賽中250 分題目,簡單的機率問題。我寫完就交了224 分,居然是全部選
手中最快的。後面的500 分,我雖然提交是最快的,不過沒有考慮一種狀況。打
開1000 分題目以後網絡就開始很不穩定了,時斷時連,1000 分題目其實算法很清
楚,因爲網絡緣由提交只有600 分左右了。
Challenge 階段開始時,我打開了房間中lympanda 的500 分程序,發現咱們兩
人的程序基本過程徹底同樣。又打開了一個,也同樣。可是在尚未反應過來的時
候,lympanda 的500 分程序被Challenge 了,接着個人500 分也被Challenge 了。
而後就沒有什麼鬥志了,在無奈中等待比賽結束。
比賽結束以後的午餐過程當中,我正好坐在Google 中國掌門人李開復旁邊。午
餐快結束時,李開復問起2 個月前的百度程序設計大賽,忽然,鬼使神差地直接
問我百度大賽的冠軍是誰?這但是在Google 的老巢呀,抖死了。我當時真懼怕他
聽完回答以後直接把我趕下桌:-P。
好在個人250 分和1000 分都Pass 了,因爲TopKiller 的1000 分超時了,我獲
得了第3 名。冠軍xuchuan 和亞軍b142857 都順利經過了3 題。
POJ Monthly Contest
大概是從2004 年8 月開始,POJ 上開始舉行每個月一次的有獎月賽。2005 年的
月賽中,每次都有機會同xreborner,Ying 等高手切磋技藝。從2006 年初開始,我
已經比較熟悉了比賽的題風,連續得到了許屢次比賽的冠軍,而且保持了良好的個
人比賽狀態。
記得2006 年4 月底,在POJ 的郵箱裏忽然發現了hawk 的信,他問我五一長
假回家的狀況。我告訴hawk 本身定在週五晚上出發。因而,次日早上就看到比
賽安排中:2006 年5 月份月賽安排在了週五晚上,太囧了。
後來,POJ 上直接出現了一系列奇怪的定義,但其實結論就是我不能以正式身
份參加月賽了。如今這些定義早已成爲笑料了,可是我不參加月賽以後,仍然有
ahyangyi 這樣的選手奪走了絕大多數的冠軍。
後兩屆baidu 程序設計大賽:
從第二屆開始,咱們習慣了在每一年6 月等待astar-baidu 的開賽。2007 年最出
乎意料的就要數CS 這個決賽題目了,我在關鍵的買槍環節犯了重要錯誤,太迷戀
AK47 了。祝賀師兄lympanda,Macsy 還有shell,不愧是真金不怕火煉。
第四屆百度大賽我參與了預賽和複賽的命題工做,可是沒有參與決賽的命題。
決賽題目是一道關於直升機的題目,印象最深的是ahyangyi 使用了一個頗有進攻
性的策略,若是採用淘汰賽,可能就是冠軍了。對我來講,經過現場比賽,有機會
和老朋友重逢,並結識了許多新選手是我最大的幸事。
利用假期空閒之時,將這幾年GCJ,ACM,TopCoder 參加的一些重要比賽做個回顧。
今天總結一下國際我的賽場吧。
國際我的賽場——三大賽事
ACM-ICPC 總決賽結束後,Mobile Robot 就宣佈解散了,也許惟一的遺憾就是
沒能得到一個真正的世界冠軍。宣佈退役ACM 以後,我仍然連續參加了那以後的
每一場世界範圍的現場編程比賽,按照時間前後分別是:TopCoder Open(簡稱
TCO)2007,TopCoder Collegiate Challenge (簡稱TCCC)2007,TCO2008 以及Google
Code Jam(簡稱GCJ)2008。每次比賽,我都度過了一段美好快樂的時光。
TopCoder 公司與三大賽事:
TopCoder 公司大概在9 年前成立,成立的緣由有些讓人匪夷所思,聽說公司
創立者原來是另外一家IT 公司的大股東,在把原來公司的股票轉手以後換了一筆錢,
開設了TopCoder 公司。然而Topcoder 和原來的IT 公司有一個重要協議,就是
Topcoder 在創立之初的兩年內不得從事軟件開發的工做。因而TopCoder 在前兩年
時間內以相似競賽的方式從事軟件開發的活動。通過9 年的發展,如今TopCoder
公司已經基本由算法競賽轉向軟件開發了。
TopCoder 公司除了在網上舉辦SRM 以外,每一年還舉辦TCO 和TCCC 等現場賽
事(固然還有TCHS,不過規模比較小,參與面也不是很大),TCO 和TCCC 分別在
每一年的6 月和11 月舉行,每次大賽都能匯聚衆多國際編程高手。另外,Google 公
司從2000 年開始,先在各大洲舉辦名爲Google Code Jam 的比賽,從2002 年開始
也舉辦全球範圍的Google Code Jam。因而這些年來,你們一直把TCO,TCCC 和
GCJ 稱爲三大賽事。
2007 年以前的GCJ 都是使用TopCoder 的比賽形式,Topcoder 的算法競賽有點
相似於IOI,ACM-ICPC 之類的競賽,題目是同一個類型的。每次比賽三道題目,一
般分數分配爲250-500-1000,比賽分爲Coding,Rest,Challenge 和System Test 四
個階段,時間各是75 分鐘(現場比賽85 分鐘),5 分鐘,15 分鐘(現場比賽10
分鐘)和不定。
TopCoder 的現場比賽都由3 個階段組成:全部選手被分爲3 個組(稱爲
Room1,2,3),每組分別進行半決賽,每組前2(或3)名直接晉級決賽,3-6 名晉
級 wildcard 比賽,wildcard 比賽12 人中的前兩名填補決賽的最後2(或1)個名額,
決賽由8(或10)名選手參加。因爲三大賽事的比賽形式相 差不大,每次現場決賽
的選手中老是有許許多多熟悉的面孔。
三大賽事的波盪起伏:
可能細心的同窗可以發現疑問,在文章最開始的一段中,我代表本身在2007
年以後沒有錯過任何現場賽事,那爲何沒有GCJ2007 呢?其實緣由很簡單,
Google 公司在2007 年整年中只舉辦了面向美洲的比賽,沒有舉行面向全世界的公
開賽。GCJ2007 的擱淺也使得整個2007 年只有TopCoder 公司獨自舉辦世界大賽。
可是,當你們覺得GCJ 將在記憶中淡去的時候,GCJ2008 從新登錄,並且新的
比賽環境與形式給選手以面目一新的感受。這裏先談談本身對這種新比賽環境的看
法吧:
GCJ2006 仍然使用的是TopCoder 標準形式,也就是說和TCO 以及TCCC 徹底
同樣,用一句話歸納就是Coding-250-500-1000-Challenge-SystemTests。
GCJ2008 比賽環境結合了ACM,TopCoder 還有IPSC(ipsc.ksp.sk)等多種比賽的
特點。
(1)每道題目分爲Easy-Hard 兩組數據,而且數據能夠下載到本地,這點好像與
IPSC 很類似,另外一個與IPSC 的共同點就是,不限制選手使用的編程工具,包
括肉眼觀察或者人工搜索。
(2)Easy 數據則和ACM 很是近似,即時提交評測,而且也設定了每次失敗提交
加4 分鐘的罰時。
(3)Hard 數據則更像TopCoder 的形式了,Hard 數據因爲是統一評測,System
Tests 能夠有效
地把懸念保留到最後一刻。
GCJ2008 的比賽形式是一種大膽的嘗試,而且也已經有了很理想的結果。
另外,值得稱讚的是,GCJ2008 中首次使用了分各大洲進行當地現場半決賽的
賽制。使得排在前500 名的選手得以參加各大洲的半決賽,也拉近了Google 公司
與選手之間的距離。從另外一個角度來講,各大洲半決賽的方法頗有效保證了決賽選
手的水平。平心而論,TopCoder 現場比賽前的最後一輪網絡淘汰賽對選手的壓力
很大,就連Petr 在2007 年都直接來了一個「滑鐵盧」,連現場賽都沒有進。而現
場比賽的公平程度遠超過網絡賽,因此經過現場賽決定決賽選手能夠必定程度上提
高決賽選手的水平,至少我我的很贊同這種作法。
擱淺的比賽無獨有偶,多是受到了2008 年全球經濟危機的影響,TCCC2008
也停辦了。並且咱們都以爲,TCCC2007 極可能是TopCoder 舉行的最後一次TCCC
了,固然TopCoder 這樣作沒有不合理的地方。
TCO 則相對穩定一些,就連每一年舉行的地點都不變,TCO 連續3 年在著名的賭
城Las Vegas 舉行。今年應該也不會改變地點。
三大賽事的舉辦,我以爲選手最大的受益就是,比賽提供了一個到美國免費
遊玩的機會。我前後去過7 次美國,其中6 次都是參加編程比賽。經過比賽的機
會,咱們得以開闊眼界,結交朋友。我我的真心但願三大賽事可以繼續舉行,可是
2009 年秋天的TCCC 和GCJ 極可能同時停辦,這也是一個不可迴避的問題,讓咱們
拭目以待吧。
美國之旅:
從2007 年以來的4 次現場比賽,雖然每次比勝過程中都有一些遺憾,可是現
在回想起來都有不盡的樂趣。
TCO2007 是我第一次到達賭城,一下飛機就看到不少賭場(CASINO),可誰知
TCO2007 整個比勝過程就是一場巨大的賭博。我當時因爲不熟悉Texas Hold'em 的
規則,在半決賽中搞錯了Flush 和Straight 的大小關係,結果初上賭場就傾家蕩產
而被淘汰出局。TopCoder 比賽中居然出賭博有關的題目,果真有Las Vegas 的特點
呀。不過在賭場裏,我仔細研究了許多賭博遊戲的規則,而後寫了幾個程序計算賭
博的指望,可是發現標準機率模型下全部遊戲的指望值全是負數(其實挺顯然的),
因而,也就以娛樂爲目的和lympanda 切磋了一下。
若是說TCCC2006 的Room1 是中國的勝利,TCO2007 的Room1 則是中國的失敗
了,雖然Ying 和lympanda 都進入了wildcard,但是都因爲一些小失誤輸掉了此次
賭博。賽後lympanda 請我去牛排館吃飯,後來那個牛排館也成爲每次TCO 比賽我
們中國選手的主要聚會地點。
TCCC2007 的小組賽還比較順利,我輕鬆擊敗了gawry,Per,marek.cygan 得到
小組第一挺進決賽。但是決賽中,我爲了提升速度以超過Petr,再加上有些緊張,
最後500 分和1000 分兩題又都掛了,落到了第5 名。TCCC2007 地點設在了奧蘭多,
比賽結束後咱們到附近的Disney Land 去玩,那裏的驚險遊戲比國內刺激得多,有
些遠遠超過個人極限,咱們一行人一直玩到深夜才返回。許多選手還一塊兒到奧蘭多
魔術隊主場觀看了NBA 現場比賽,惋惜最後一節成爲了垃圾時間。
TCO2008 我也依靠飄逸的1000 分題中800+分的提交闖入決賽。決賽前我還和
visualage 聊天,誇耀本身歷來沒有全部題目全掛,更沒有拿過負分。但是在隨後
的決賽中,這兩個「夢想」就都實現了,PE 對個人評價是太緊張了。基本每次
TopCoder 現場比賽都能見到PE,誰知他每次懷疑我某些題目的正確性的時候,我
的程序就必定是錯的,若是下次我參加決賽,您就不要再看我程序了吧(呵呵,開
個玩笑)。
不過在決賽Challenge 階段的最後時刻,我從第一視角目擊了Petr 和Tomek 的
巔峯對決。在還有15 秒鐘結束時Petr 還落後Tomek 大概30 分左右,Petr 成功
Challenge 了一個超過了Tomek,可是Tomek 利用短短的10 秒鐘也提交了一個成
功Challenge 又超了回來,誰知Petr 獲得這個信息以後又提交了一個Challenge,可
是運氣稍差,若是那個數據用來Challenge 個人程序的話,Petr 就可以在最後1 秒
再次奪回冠軍的位置。可以到最後一秒還能有機會成功翻盤的必定是神通常的人物,
可以把神通常的人物逼到最後一秒的也必定是神通常的人物,兩個神通常的人物你
來我往,爲你們上演了一場精彩的比賽。
歐洲獨霸:
又一次引用黃金雄教授在杭州2008 時說的話,ACM 總決賽的實力分佈由原先
的美洲獨霸逐漸轉向瞭如今的亞歐爭霸。可是,我根據這些年的比賽結果發現,從
2006 年開始,團體比賽和我的比賽,特別是我的比賽,歐洲選手一直保持着絕對
的霸主地位,亞歐爭霸的說法實在有些牽強。
從2005 年開始,幾乎全部三大賽事的冠軍都是歐洲選手。成績最好的要數俄
羅斯,俄羅斯選手以Petr,andrewzta 等爲表明。俄羅斯選手訓練刻苦,編程能力
極強。歐洲的另外一霸主就是波蘭,波蘭選手具備很強的靈氣,以tomek,marek 以
及Eryx 爲表明,程序設計在他們手中體現出了藝術氣息。
前幾天我也看到關於取消NOIP 保送資格的文章,我沒有發表評論,由於我沒
有看懂,爲何文章裏把保送和保送資格混爲一談,讓人以爲啼笑皆非。這裏我對
保送資格仍是想法很少,不過想比較一下咱們中國選手與歐洲選手思惟能力上的差
別。
在高中時,吳文虎老師就常說中國選手的IOI 成績很優秀,的確這幾年從IOI
成績上看,中國是絕對的霸主。但是ACM-ICPC 的成績,俄羅斯和波蘭等強隊的成
績卻遠在中國之上。因而咱們總結的緣由是:歐洲選手的編程能力強。我很是贊成
這個說法。
可是「歐洲選手的編程能力強」的說法並不說明他們的算法能力弱,相反他
們的思惟素質很是高,他們具備很是正統和嚴密的思惟方式,體現出通過長期訓練
的思惟能力和素質。
我 以爲中國的「高手」和許多經過高考進入名校的「神人」,在大學以前接
受的教育都是以選拔爲目的的,並無太多針對思惟方式和能力的訓練。記得小學
要考重點 初中,初中則拼搏重點高中,高中期間則夢想名牌大學,而在學習期間,
咱們並無太多機會訓練本身的思惟能力,至少在個人中學階段是這樣的。雖然很
多高中已 經不遺餘力經過相似研究性學習的方法鍛鍊咱們的創新能力,可是仍然
不能改變選拔性考試「高考」這一事實。而在與西方選手交流的過程當中,我以爲許
多思惟能力 優秀的學生很早就有機會接受系統的思惟能力訓練,尋找最適合本身
的思考方法。我一次有機會看Eryx 留下的草稿,發現他考慮問題有很是嚴密的過
程,從理解題目到想出算法每步都有根有據,並非隨機碰撞的結果。
如今歐洲選手與咱們相比,思惟能力上也並無劣勢。我有幸在投身OI 競賽
以後,獲得許多機會與其它選手交流,學習他們的思考方法,努力鍛鍊本身這方面
的能力,試圖與衆多歐洲選手對抗。
Mountain View 登頂:
GCJ2008 在Google 總部Mountain View 舉行,賽前我想用Ying 的一句話來表
達我對比賽奪冠的渴望,「我雖然獲過不少獎,可是缺乏一個世界冠軍」。早在
GCJ2006,我就擁有機會得到冠軍,可是在失去那次機會以後一等就是整整的兩年。
比賽開始不久,bmerry 的強勢起跑使我逐漸失去了奪冠的念頭,只得一心作
好眼前的題目。bmerry 在不到2 個小時的時間裏就作出了除了C- Hard 之外的全部
題目,他只要在最後一小時作出C- Hard,就基本上能夠鎖定冠軍了。
不過我克服開場的不順利以後,磕磕碰碰地在2 小時過5 分順利經過了E-Easy
和E-Hard。擺在我面前的只有B-Hard 和C-Hard。B 題和C 題相比之下,B 題我已
經有了必定的想法,但是C 則是徹底沒有想法。因而我決定先作B,GCJ2008 的B
題簡直是個人剋星,我前後用了100 分鐘時間作這題都沒有結果,能夠說當時狀
態不好。大概到了2:40 的時候,我查看board 時忽然發現了一件使人窒息的事情,
bmerry 已經嘗試了C-Hard 而且超時了。因爲C-Hard 的分數略高於B-Hard,我最後
想要超過bmerry 就必須作出C-Hard。果斷放棄B-Hard 以後,並無想出C-Hard
的方法,寫了一個搜索程序可是內心很沒底,Hard 數據的提交時限是8 分鐘,於
是到了2 小時52 分的時候,我毅然打開C-Hard,用搜索的程序運行C-Hard,在焦
急的等待以後,程序在運行了1 分多鐘之後神奇地運行結束了。我依靠搜索方法
經過了C-Hard,一舉超過了bmerry。1 分鐘後zhuzeyuan 也作出了一樣的題目,超
過了bmerry,因爲罰時排在第2 名。我和zhuzeyuan 還有bmerry 比勝過程中都有
不小的失誤,我頗有幸把失誤的損失降到了最低點,終於得到了第一個世界比賽的
冠軍。
此次GCJ 的題目有很是詳細的解答,能夠在比賽的連接裏找到。GCJ2008 的比
賽結果從必定意義上,打破了歐洲選手多年的獨霸場面。加上原籍南非的bmerry,
前五名中都沒有出現歐洲選手的名字,這也是在多年現場比賽中沒有出現過的。
這一年,我很高興看到OI 選手中出現了ahyangyi,yuhch123,Loner 等各方面
都極爲出色的新人,真心但願大家可以早日適應大學的學習生活,再創佳績。
衆多新人的加盟,大大提升了清華ACM 團隊的實力。在2008 年,清華大學
ACM 隊創紀錄地得到了4 個分區賽的冠軍。明天最後一篇回憶中將分享ACM-2008
中發生的趣事。

版權歸AC Rush全部。本站僅爲轉載,感謝樓教主。
html

相關文章
相關標籤/搜索