为什么Codeforces上要使用C/C++

虽然这是常识,但是毕竟因为我现在Java更熟悉一些,也在用Java做Codeforces。加上这已经被Java卡了两次IO了。所以水一发。(老司机退散,就是典型的破事水系列)


从一道水题开始

Codeforces Round #711 Two Houses 图论
题解先说结论。对于所有可能的两个点的配对的入度差的绝对值进行从大到小排序。依次查询这些配对中入度大的到入度小的的点的连通性。如果能联通,则这两个点满足条件。

这个题说白了就是排个序,然后依次输出查询,然后输入读入查询的结果。最坏$n^2$次查询,$n$的规模也就500,也就是25W的输入输出。算法复杂度$O(n^2\cdot{log(n)})$,就算常数比较大,按100W次运算(目前CF1秒1000W都能跑)。时间限制3.5秒。

我们来看看各语言的提交情况:

C++ 11
Java 11
Nodejs和JS(无人提交)

排除一些时间开销非常小的提交(比如C++中32ms的,Java中233ms的),因为这些提交不知道是利用的SPJ的bug还是发现了什么特殊构造方法,这些提交普遍没有做任何查询,硬是靠入度直接给出输出。回头有时间再研究,这里我们先排除这些提交。


Java和Python

太惨了。几乎全是3s。其实这个不是最惨的。点开一个Java的提交我们可以看到下面这些东西:

就Java自带的Scanner基本上没人用的,都是祖宗传下来的外挂,不然基本上没法玩。

我们再来看看这道题TLE的玩家列表:

别问,问就是祖上的外挂不优越。再问就是这波我也升级了下外挂……

NodeJS和JS

不是说这个星球上没有人用Node打CF。但是遇到这种交互式的题目真的没办法。

还是有人用Nodejs玩的

我试着找了下,怎么在CF上用Node玩呢?找到了下面这个玩意:

How to submit a Node.JS solution on Code Forces - Codeforces
Codeforces. Programming competitions and contests, programming community

但是,看了半天,到底是读完了输入,然后输出。虽然讲道理,onData应该是可以应对交互输入的。但是实在是没精力弄了。

但总的来说,感觉Node比Java还难玩。


C/C++

不说了,看一眼TLE的玩家列表吧:

对。就只有6个提交4个菜鸡居然T了。而且T在样例的2组数据,一看就是手滑忘了flush的。


不是说Java不好,Node不行。而是不要用镰刀去切菜,切菜请用祖传永灵刀。

最后,我就只是个找思路都要找半天的老菜鸡,实在不想把注意力分散刀语言问题上。所以人生苦短,我选C++。

展示评论