昨天(dbq,这个博客鸽了一个多月,实则是2019年1月),我参加了我的第一次TopCoder竞赛,感觉体验还不错。在之前,我就想参加TopCoder上的比赛,但是我不知道怎么参加,也没能成功找到教程。于是我计划写一个简单的指南,为想参加TopCoder的选手提供一点点经验。
UPD:这个博文已于2020/4/30更新
第一次发布于2020年3月8日 下午11:08
1、TopCoder是啥?
如果你打开TopCoder的官网,你会发现似乎这不是一个程序设计竞赛网站(和Codeforces/AtCoder)差别很大。按照我的了解,这是因为TopCoder网站经历了一次改版。现在的网站首页主要是他们的众包业务,而比赛并不显示了。
程序设计竞赛首页是这个链接,但是题库和比赛界面却是这个链接。访问这些网站可能需要增智慧才能连上,可以自己试试具体情况如何。
TopCoder是一个比较频繁的举办算法竞赛的网站,一场比赛由三道题组成,如果要说赛制,大概是Codeforces和OI之间的一种赛制。
第一场SRM比赛是在2001年5月8日举办的,至今已经举办了七百多场。我把所有七百多场SRM参与选手数目和时间做成散点图(注意:时间轴可能并非线性的)。我们可以借此对这个平台略略了解一二。
我们可以看到,在2014年前TopCoder选手的数目是在稳步增长的。TopCoder在算法竞赛的历史上发挥了重大的作用,第一个推广了颜色并塑造了线上的算法竞赛,而在Codeforces诞生的2010年,如Codeforces网站底注所写,Codeforces应当是唯一的Web2.0比赛平台。也就是说在那之前应当只有TopCoder一个主要平台。不仅如此,在ICPC World Final的现场直播中,会显示一个选手的Codeforces和TopCoder Rating,也足以说明TopCoder的影响力。但在2014年之后的一个时间点开始选手数目就开始急剧下降。按照CF选手的说法,是因为网站的一次改版导致了选手的流失。可以参考这个CF博客:https://codeforces.com/blog/entry/21879。虽然现在一场TopCoder的参赛选手可能只有一场Codeforces的2%左右,但是TopCoder的题目质量依然稳定,顶级选手也频频选择参加,每年一度的TopCoder Open,更是是水平一流的全球线下算法竞赛。因此,在2020年参加TopCoder竞赛,也不失为一种休闲娱乐,刷题放松的好方法,而由于现在实际参与的选手数量相当有限,而没有任何类似的教程,因此我写点这个也是有价值的(?)。
2、打TopCoder的体验
一场TopCoder比赛的结构是这样的:75分钟 Coding Phase 做题,5分钟 Intermission 间歇,15分钟Challenge,就和Codeforces的Hack差不多。75分钟中共有三道题目,较为典型的分数分布是250-500-1000,没有部分分。随着时间的流逝,分数会逐渐缩水。需要特别注意的是,TopCoder的分数并非是按照AC时间计算的,而是按照从你打开题目到提交代码的时间计算的。这样一来,有可能你通过一道题更早,但是那题得分更低(因为别人更晚打开题目)
每道题都会提供比较强的若干个样例,供选手调试。值得一提的是,在比赛过程中提交代码,并不会测试包括样例、Pretest或System Test等任何数据。(比赛平台提供在线测试自己提供和主办方提供的样例的功能,但是你不去用也不强制)因此任何能够通过主办方平台编译的代码都可以在这75分钟内获得分数。
在Challenge时,你可以看到任何选手的任何代码,包括自己没能通过的题。提供一组数据使得该选手出错,你就获得了50分,否则失去25分。在15分钟之后将会进行System Test。按照经验SystemTest可能在一两分钟之内完成。如果你打开榜的话,你会看到不断有人通过系统测试(当然,这是因为FST的选手马上到榜的后面去了)。然后分数将会在一两分钟之内更新,题解也马上会发出。这一点,要比Codeforces的一些比赛做的好一些。
TopCoder比赛的总体体验应当是所有线上平台中最紧张刺激,最趣味的,感觉TopCoder整个设计的和游戏相差无几(除了题目是真正的算法题目)。
在TopCoder平台上,在比赛时,选手们分配到了不同的房间,这时每一个房间同时可以起到聊天室的作用。我第一次接触的时候,的确心中产生了一个疑问:如果让选手在比赛过程中聊天,难道不是会可以互透题解吗?实则不然,想象自己在玩吃鸡游戏,能够聊天也必然不会告诉别人自己在那里。于此同时,聊天室为参赛选手(我)带来了极强的参与感,有助于缓解比赛紧张,包括Challenge Phase的时候聊天也很有意思。
对于不喜欢聊天的选手,TopCoder的桌面客户端上面还提供了屏蔽聊天功能等功能。
3、TopCoder客户端?Web Arena?
在二零零几年TopCoder刚刚诞生的时候,选手参赛的方式就是使用Java Applet,一个专门用于参加TopCoder竞赛的桌面程序。当然,仅仅使用这个程序是不好用的,包括从外面复制代码似乎都做不到。于是很多选手都使用了各种插件,可以参考这个CF博客https://codeforces.com/blog/entry/61252。现在的很多选手,比如Petr,都仍然在使用Java客户端。
但我第一次参加TopCoder竞赛时,先使用了Java客户端,然后在聊天室内问了问,大家都在使用网页端。尽管网页端容易入门,而且连接上的各种问题会少很多,想要获得最好的比赛效果,还是使用一个良好配置的客户端(可能需要在客户端里写上代理地址)更好。
我使用的插件是Greed,这个插件好就好在功能比较全,一个插件解决所有问题。这个插件能做到的事情有:
- 生成一个文件,这样可以用自己习惯的编辑器编译
- 自动生成类和函数的名称
- 自动测试每个样例的运行结果和时间
- 告诉你:你在打开这个题到现在已经经过了多长时间,马上提交能得几分
如果想要在TopCoder上做题训练,如上所说效率最高的办法当然是使用一个配置了插件的客户端。需要注意训练房间和比赛的规则是一样的,你提交之后什么也不会测,需要在上面的控制栏里面选择”Run System Test”才能够测试所有测试点。当然,你也可以无限hack已经提交很久的代码
4、其他
TC 的题目代码大多不是很长,但是思维复杂度较高。 而且似乎动态规划类型的题目比较多。 TC 的评测机很快(你会感觉很快但是实际上是因为提交的时候没有评测,速度大概正常吧也不算老爷机),并且开 -O2 优化,而时间限制默认 为 2 秒,内存限制默认为 256MB,所以基本不用担心被卡常数等问题。
TopCoder是在线算法竞赛的始祖,引入了颜色,Challenge,Virtual Participation,Room等概念,希望我以后能继续多打TopCoder,提高思维水平……
发表回复