ACRush楼天成回忆录.docx
- 文档编号:30521060
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:46
- 大小:189.08KB
ACRush楼天成回忆录.docx
《ACRush楼天成回忆录.docx》由会员分享,可在线阅读,更多相关《ACRush楼天成回忆录.docx(46页珍藏版)》请在冰豆网上搜索。
ACRush楼天成回忆录
利用假期空闲之时,将这几年GCJ,ACM,TopCoder参加的一些重要比赛作个回顾。
首先是GCJ2006的回忆。
GoogleCodeJam2006
一波三折:
GoogleCodeJam2006是我第一次到美国参加现场的程序设计比赛。
GoogleCodeJam2006的比赛地点设在了纽约,这次纽约之行之前的签证出了不小的问题,这里非常感谢大家对我们的关心,特别感谢吴总(wyy)和鲁小石的帮助,使我最终踏上纽约之旅。
从北京到纽约的飞行时间是13个半小时,由于是第一次做超过8小时的飞机,没有什么必要的经验和准备,路途非常疲劳。
一到宾馆就睡了,结果由于手机铃声的时间使用的是东方时间,差了12个小时,一觉把所有事情连晚饭一起都睡过了,随便吃点东西就继续睡了。
之后的所有现场比赛我都养成了提前睡觉的习惯,以保证充足的体力。
比赛过程:
比赛时精神状态还算可以,但是分配了比赛房间之后发现自己和tomek分在一个房间,真是很不爽;在和旁边的zhuzeyuan抱怨的时候,发现他和Petr一个房间,彼此彼此吧。
下面就是比赛过程了,总体来说比赛过程比想象的艰苦,不过其实在SystemTest之前的结果还是很满意的,先简单描述一下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处在一个房间,所以我做出了一个大胆的决定,就是challengetomek的1000分题,我随机生成了一个随机大数据,在最后时刻提交了这个challenge,系统返回了一个令人窒息的结果:
successfullychallenge。
凭借这50分我一举超过了tomek和andrewzta,在SystemTest之前占据了榜首的位置。
戏剧性的结果:
我很有幸能够在第一次参加现场比赛时,就能够和冠军这么接近,如果SystemTest能够全部Pass的话,这可以认为是一场完美的比赛。
可是,整个故事就好像是被刻意设计的一样,SystemTest之后的结果使我目瞪口呆:
首先是250分的题目,我由于有一个地方没有及时使用double,而造成整数越界;然后,1000分的题目简直是悲剧的最高境界,我在高斯消元的时候没有及时把一个重要变量暂存,导致影响了结果,没有想到竟然躲过了那么多大数据,但是不能通过SystemTest。
最后排在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的提醒),感谢您在我高中时期教授了我许多编程技巧,我一直沿用至今。
利用假期空闲之时,将这几年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一起在参加XX之星程序设计大赛,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竞赛可以看作一些老朋友一起进行的一场智力游戏。
利用假期空闲之时,将这几年GCJ,ACM,TopCoder参加的一些重要比赛作个回顾。
回顾了GCJ2006和2005年的ACM之后,转向TopCoder的比赛吧。
我参加的最早的TopCoder赛事是TCCC2006。
TCCC2006——死亡之组
TopCoderCollegiateChallenge(简称TCCC)是TopCoder一般在秋季举行的面向全世界在校学生的程序设计大赛,2006年的TCCC在圣地亚哥举行。
从北京到旧金山的飞行只需要11个小时左右,所以不至于那么疲劳。
路上一切都很顺利,很感谢OpenGL的提醒,对于超过8个小时飞行自带拖鞋和枕头对我来说还是很重要的。
TCCC2006使用的标准的TopCoder现场比赛形式,比赛有48名选手参加,首先48名选手被分为16个人一组,每组分别进行半决赛,前2名直接晋级决赛,3-6名晋级wildcard比赛,wildcard比赛12人中的前两名填补决赛的最后2个名额,决赛由8个选手参加。
TopCoder现场比赛中很重要的一个创新是:
每名比赛选手在观众席前都有一个同步的显示器,这样观众可以看到选手任何时刻做的事情,极大增强了互动性。
TCCC2006的Room1和后面的FinalRound都可谓是死亡之组。
现在就回忆一下这两场激烈的比赛吧。
Room1:
至于3个房间的分配,TopCoder按照注册截止时选手的Rating分布蛇形分配。
但是TCCC2006的房间实力分布极不平衡,我与上届冠军tomek,著名选手reid,Egor,halyavin还有Rating不高但是实力极强的Ying和ardiankp同被分到了Room1,赛前Room1成为公认的死亡之组。
在圣地亚哥,我和师兄Macsy(张一飞)同一个房间,很感谢师兄的关心,我那几天休息的都很好。
要知道如果同房的人有10小时左右的时差的话,一人必须很小心才能保证不影响另一人的休息。
Room1在我抵达美国的第二天早上进行,选手允许提前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分题目之后,我刚刚意识到Room1的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分钟时间也没能调试通过。
这题过于琐碎,Room1中最终没有选手通过600分题,并且成就了一个刺激的Challenge阶段。
Coding阶段我和tomek采用了截然不同的策略,我跳过600直攻900,而tomek在600中挣扎了很长时间才放弃。
Coding阶段结束时,有4名选手提交了3题。
我依靠速度优势领先同样提交250和900的tomek35分左右。
Challenge阶段开始时,我盲cha(blindchallenge)了一个最后时刻提交的900分程序,但是由于我选择的数据实在太弱,失去了25分。
这样我和后面的tomek只相差10分左右了,所以我决定只要tomek不动,我也不动了。
其实,当时tomek已经知道自己的900是错的,Challenge阶段他估计已经放弃了。
我的Challenge阶段最终就以-25分结束。
之后的Challenge就是Ying(王颖)展现勇气和智慧的舞台了。
他Challenge掉了所有提交的600,凭借225分的加分超过了我,排在榜首。
这样比赛的形式也一目了然了,7位选手提交了900,我依靠速度优势领先第四名reid超过100分。
只要我两道题目能够PassedSystemTest就足以进入FinalRound了。
SystemTest之前,我和Ying讨论他“超神”的Challenge阶段。
这是我第一次参加TopCoder的现场比赛,发现SystemTest结果显示是按照SystemTest之前的排名倒序进行的。
测试到我时,除了tomek的4名选手的900都过了。
显示我的结果时,两个绿框闪烁了很久终于显示出了两个大大的钩,我终于可以欢呼庆祝胜利了。
我前面的Ying也两题全过了。
这样我们两位中国选手得以
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACRush 天成 回忆录