利用假期空闲之时,将这几年GCJ,ACM,TopCoder 参加的一些重要比赛作个
回顾。昨天是GCJ2006 的回忆,今天 时间 上更早一些吧,我现在还清晰记得3 年数。最后把方案数求和除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
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 怎么做,我都统一回答:是胡伟栋做的。