2010年12月20日 星期一

ACM Kuala Lumpur Regional 2010 比賽過程

中大終於拿到了十一年來的Champion!
賽前真的沒有想過這麼順利
我們training經常縱使中途很多無聊失誤亦全清早走,今次真正比賽終於可以發揮出來!
之前聽到題目是由美國的人出,曾經擔心會很頹,但最後題目質素還是非常好
原來是由uva那堆有名的出題者出的

------------------------------------------------------------

比賽因為技術問題延誤了很多,又加多了一個試機session。之後從volunteer中得知我們比賽的機和試機的機不同,又躁底了。試完機大家再入場準備比賽,卻在比賽場地等了一個多小時才開始。他完全沒有嚴止大家使用電腦,於是大家便一起打自已的template。打完template發現還有很多時間,kn又把geometry的library打完。打完後還是有很多時間,大家便伏在枱上休息。
過了很長時間,終於比賽開始了。一開始開題目,題目感覺不長,先把一堆短的題目抽出來看。不久發現頹題B,上機提交得第一個Yes(5)。CTLi隨即上題I,中途卡了一卡,有少許慢,過sample後提交,又得到Yes(23)。我和kn在CTLi做的途中發現已有隊過H,研究一下卻不懂做,找kn討論一下。中途嘗試問CTLi但被無視,結果和kn討論一大堆後想到了公式,待I打完立即上H,很快便Yes(25)。kn隨即緊接做他已看的頹題,亦不久成功解決得到第4個Yes(34)。CTLi看完題D解給我聽,感覺很簡單,我便分給kn做D,悲劇就此開始。kn搞了一會兒很辛苦終於過到sample,這是已經6x分鐘,提交首先交錯題目,再交得到WA。我的題G也想得差不多,便搶機開始coding。Code到中途有bug,過不到sample,便和kn交替地上。CTLi又可以上,於是便讓他先上。中途kn找我幫忙,但好像沒有理會他,看了看便繼續埋頭做自已的題G。搞了好一段時間和不斷的換位上機,CTLi終於過了題C(98+1RE)。看到F已經有人過,是經典的steiner tree DP,想了想便想到DP的狀態和做法。經過一輪掙扎,我還是我的算法告訴做DP有更高準確度的CTLi,讓他準備上題F。我又發現我的code有些很無聊的bug,改完後過了sample,又再交幸運地沒有bug,得到第6個Yes(108)。之後看看kn的題D的題目,發現有地方CTLi看漏了,便叫kn過來看,很快想到解決辦法,kn改後再交終於Yes了(114+3WA)。一輪失誤後終於過了題D到了7題,但是現在罰時已經大幅落後南洋理工(NTU)。值得一提的是雖然旁邊大會有很多準備好的氣球,但在頭一個多小時都沒有派。

出了第7題後心情可以放鬆少許,看看scoreboard的情況,但知道形勢不妙,因為我們不懂得做題E,而罰時落後,而最不利的是CDQ有機會會做到。不管怎樣,我和kn開始研究題J的幾何。聽kn說明題意後,好像便是經典的O(n^2 log n) sort by angle的題目。過了一段時間CTLi需要debug,便換上kn開始code,我亦幫kn寫中間計算面積的部份。CTLi的題F搞了很久終於過到sample,提交卻得到TLE。我再想想,過了一會兒想到加速的方法,可以降低一個dimension,和CTLi討論一下便繼續讓CTLi上。這是kn又說他的題J差不多寫好,等我寫幾何計算面積的部份。我便立即在紙上寫我的code,讓kn打上機,但那段code發現有錯。CTLi這時又得到一個WA,我便沒有理kn,專心幫CTLi fix那個bug。中途又幫kn作test case去測試我寫錯的部份。終於CTLi上機改好,再交得到第8個Yes(168+1TLE+1WA)。我們的第二維持了不久便被HKUST過頭了。之後我讓CTLi全力想E,我和kn一起做J。又過了一大段時間,終於過了sample,提交得到WA。中間發現kn寫rotation的東西寫得很差很亂,把那段code簡化,和修改了有些for loop撞counter variable名的情況再交,仍是得到WA。這時候和CTLi討論了很長時間(途中因為CTLi不斷ban我的想法又不說原因令我有些躁),發現我們的assumption不正確,有一個case完全沒有考慮。這時我還高興,因為這個case不太易想,很可能NTU會發現不到,這樣我們有機會9題便勝出。kn上機加上再考慮那個case,又handle兩點分在兩邊的case,又過了自已新加的test case再交。交完不久kn發現那個case handle錯了,未等response再交,最後得出兩個也是Yes(229+2WA)。再看scoreboard失望地發現NTU亦過了題J,同樣達到9題,罰時領先我們。而CTLi又一直說不懂做題E,於是就等同於這次比賽已經輸了。

最後當然三個人一齊在想題E。我提出了可以拆成兩個式然後再用Chinese Remainder Theorem,而mod 2^12的式可以暴試找答案。但對於另一公式亦想不到解決方法。再想了一陣子CTLi說他可以試試頹做,我提出他把算法告訴我們然後他繼續想,我們上機頹做,但他說很簡單很快便寫好。無奈地讓他上機去做,不久CTLi便寫好了,打入sample發現極速出結果。再randomly打一寫大的數亦是立即可以出答案。CTLi提出立即交,但我和kn建議先打表。但打表途中我們發現如果沒有答案便會loop死,而我們又不知道怎樣check有沒有答案。我又提出去數iteration的數目,太多時便break。寫完發現打表打得極慢,於是不知道為甚麼又放棄了。最後我們一致通過交CTLi那個“頹”program,便很緊張地等結果。這時我們再試試random的test case,發現仍然是很快。由於CTLi不斷說他的方法很頹,我擔心假如NTU知道我們過了便又會試試頹做,所以還是不讓NTU知道的好。我便叫隊友看到Yes不要大叫,保持秘密不讓NTU知道。

因為judging time很長時間,我在很緊張和沒有警惕的情況突然下看到巨型綠色YES(247),也不小心大聲叫了YES,很失敗。到最後我們還是繼續假裝很忙,一開始在分題目,把整份題目從我們打印的code中抽出來。中途又有volunteer見我們渣攤來和我們說話,但由於他們壓低聲量,我完全不知道他們說甚麼。只記得有位大叔走過來看到我們8個氣球,笑說題目是不是很難,沒有可能做完呢。之後無聊了一會兒便叫CTLi打code,讓我留意CTLi打code的問題,好讓在World Final可以進步。CTLi的問題發現有:1.不用alt-tab,2.不用右手尾指,3.雙手放在keyboard沒有default固定的位置,4.不懂用numpad。現在已策劃一連串特訓給CTLi。感覺最後50分鐘時間過得很慢。

比賽結束後很緊張,先走到南洋理工一隊問題數,他們很灰地搖頭(大概自己在jakarta也是差不多的表情吧)。然後再跑去問HKUST的題數,是8題。這時腦袋有些空白,回到座位向隊友報告後,仍好像未必接受自己是champion的事實,有點不知所措的感覺。先把漏掉的氣球拿回拍一下照,之後又有很多人找我們問題目和拿code,又有找我們拍照。走時統一統計,當我還想認叻的時候,發現原來自己只是做了兩題。結論就是我今天的比賽是渣灘的。有傳言說新加坡某大學出了10題,我不太相信,因為已問過NTU。我猜是他們把我們認錯是新加坡的隊伍吧。

到頒獎禮,心急等了一大段時間終於證實自已確實是champion。上台的一刻想到等了十一年終於拿到了,有些感動。驚訝地發現HKUST一個人都不在,NTU也只有一個人上台拿獎。之後有很多人找我們拍照,亦有不少人借我們的獎盃拍照。我們亦找judges討論題E的做法,發現兩個judges和我們的做法也不相同。最後不斷拍照,連回hostel的巴士也沒有上。最後Derek Kisman在我們拍照時走過來又不敢打擾我們拍照,我們便立即輪流和他單獨拍照,他顯得有些無奈XD。拍完後原來他是想來找CTLi討論E的題解,說CTLi的做法好像可以解釋他一個之前不明白的地方。走的時候本來打算步行回到hostel(大約15-20分鐘路程),但途中看到volunteer姐姐的車,她們很好心地車了我們回去了。對於IIUM主辦的volunteer姐姐印象還是很不錯的。

趣事:
1. CJ還是很喜歡叫全部人拍手掌的演講
2. CTLi影相時不肯笑,連volunteer姐姐都忍不住說他"You look so sad!" 我和kn一齊“sosad!”
3. 最後找CJ拍照時,他有點不耐煩。問我們甚麼學校,答了發現我們第一,然後送了我們特別禮物,是一個空的袋 (o:

沒有留言:

張貼留言