一些防止CSP-J2/S2爆零的注意事项

· · 个人记录

声明:由于本人是一个蒟蒻,能力有限,如果发现我说的有问题或者有其他需要注意的地方,欢迎评论区里留言讨论。不过我不接受吵架。

距离 20241026 日的 CSP-J/S 第二轮认证越来越近了,而在往年的比赛中,有很多人因为一些细节没注意,导致最终成绩 0 分,造成巨大的损失。所以,为了警示他人,也同时提醒自己,我特此写了这篇文章。

完成代码阶段

部分省市的复赛的编程环境是 Windows,不提供 NOI Linux,而正式评测是在 NOI Linux 系统下进行的,而 Linux 对程序的要求更高,一些写法在 Windows 系统下可以编译通过,而在 Linux 下则会 CE。

为了避免 \textup{\textbf{\textcolor{orange}{Compile Error}}},我在这儿做几点提醒:

  1. 直接引用 bits/stdc++.h 的万能头文件,这个头文件中包含了算法竞赛中会用到的绝大多数的头文件,可以避免一些因为没有手动引入必要的头文件而导致的编译错误(之前我就被这么搞过,在自己的电脑上编译成功,在 Luogu 上面直接 CE),还可以省去一些打头文件所用的时间 (其实就是懒哈哈哈)。同时注意一下:这个万能头的斜杠必须是从右向左倾斜的,而不是从左往右的那个反斜杠,如果打成反斜杠,可能在本地上编译通过,但在 Linux 上会 CE。

  2. 把整个程序都封装到自己的 namespace 里面,避免出现变量名与内置函数名重复而导致的 CE;当然,如果你不嫌麻烦,可以直接不写 using namespace std;,而在每个调用的函数前加上 std::,同样也能避免。或者你也可以在程序的开头进行宏定义,比如 #define next NEXT,这样也可以解决这个问题。

  3. 建议在编译选项中加入编译选项:-O2 -std=c++14,因为你的程序将会在 C++14 的环境下进行评测,这样可以避免你使用了一些新版 C++ 的新特性而导致的编译错误。当然,如果编译器版本比较老(比如是 GCC4 的),可能不支持 C++14,那你可以改成 -O2 -std=c++11

  4. 每个函数的最后一定要加上返回值,哪怕是 void 类型的函数也要加上 return,main 函数的返回值必须是 0,否则在本地上能正常运行,而在评测机上就会 RE(我昨天刚试过)。

  5. 数组不要开的过大,对于 512MB 的内存限制,int 类型的数组顶多开到 1 \times 10^8,否则就会 MLE,同时把所有的数组全部定义为全局变量,减少内存的占用。同时注意,可以适当把数组大小开得大一些,我一般会把数组大小开到比给定的数据的最大值大 50,比如一个 10^5 的数据,我会把数组开到 100050,以免爆掉。

  6. 对于一些变量,如果不是要在其他函数中同时用到,尽量少定义全局变量,直接定义局部变量,避免一些你意想不到的 CE。

  7. 最后封装程序前,用编译按钮再编译一遍,不要用快捷键,避免因为手抖或者其他一些不可控因素而导致输入一些额外的字符。

代码封装阶段

  1. 在 NOI 系列竞赛中,基本上都是需要使用文件输入输出的,也就是说,你需要在你的程序中加入 freopen,这是一个文件输入输出的函数,如果不加的话一般是一定会爆零的(国庆节期间洛谷秋令营的两场模拟赛均有这种情况爆零的)。本文最后会大致讲解一下 freopen 的使用。

  2. 一定要注意,不管是输入输出文件名,还是可执行文件名和选手目录下的文件夹名,全部都是小写英文字母,不要打成大写了,要不然会导致评测机识别不出来的。

  3. 输入输出文件名、可执行文件名、文件夹名,都是不带空格的,不要手抖多打个空格,也会导致评测机识别不出来。

  4. 选手目录的文件名一般都是选手的准考证号,存放位置要听从监考老师的指令,不要随意存放。在选手目录下,要分别建立 4 个子文件夹,这四个子文件夹的文件名是各个题目对应的英文名称,题目中都会告诉你的,照着他打上去就行了。在每个子文件夹下,需要保证有这道题的代码文件,就是对应的 .cpp 文件,这个文件名也是跟题目告诉你的英文名一样,照着打上去就行了。

  5. 提交的代码所占大小一般是要求不超过 100KB 的,不过一般顶多也就是三四百行的代码,远远达不到 100KB,所以放心就好。

  6. 最后要把选手目录给打包成一个 .zip 文件,而且建议是点击鼠标右键,用菜单栏里面的添加到压缩文件中,注意选择的文件类型是 .zip,文件名是你的准考证号,这样可以保证在 zip 文件下有唯一的选手目录文件夹,在这个选手目录下有 4 个子文件夹,每个子文件夹里最少要包含本题对应的 cpp 文件,如果有其他多余文件,只要最后的压缩包大小不超过限制的大小即可。

  7. 封装代码时,要检查一下代码里面的 freopen 是否写了并且保证没有被注释掉,为了调试程序而输出的一些内容是否删除,避免爆零。

(注意:第 4 点和第 6 点每个省的要求都不同,我这里说的只是洛谷秋令营课程模拟赛的要求,具体操作请按照监考老师的要求走)

文件读写的使用

在 NOI 系列竞赛中,文件读写是必须的,操作也非常简单,你只需要在 main 函数的最开头加上两个 freopen 即可,freopen() 函数定义在头文件 cstdio 中。

freopen("filename.in", "r", stdin);
freopen("filename.out", "w", stdout);

其中的 filename 就是这个题目所给出的的英文名。

我能想到的就这么多了,如果大家还有其他补充的内容,可以在讨论区补充。

最后,祝大家在 CSP-J2/S2 中 RP++,取得好成绩!