受 OI 赛制比赛 emergency kit By Qingyu 启发,结合自身经验进行了补充。
有用的指令
限制虚拟内存
评测时测量的空间大小是虚拟空间的大小,即,开了多少算多少。
使用 ulimit -v X
可以限制内存空间为 X
的值,其中的 v 即为 virtual 的意思。单位为 KiB,1024 进制。
该命令在同一终端中有效,多次使用只能 减小 限制,而不能增加。如果限制错了重新打开一个终端即可。
使用该命令后,运行程序若超过此大小会发生 RE。
不能 和 fsanitize
混用。
限制栈空间
使用 ulimit -s X
可以限制内存空间为 X
的值,其中的 s 即为 stack 的意思。单位同上。
同上,在同一终端中有效。
不要 将 X
设置为 unlimited
,这会在爆栈的时候 死机。
测量虚拟内存
如果用 ulimit -v
限制之后 RE 了,能知道爆空间了,但是不知道为啥爆了,爆了多少,就可以用此法。
在程序末尾加上一行 system("grep VmPeak /proc/${PPID}/status");
,这一句话会将使用虚拟内存空间输出到 stdout
,注意,如果开了文件操作,会输入到文件里面。
记得提交之前要删除掉这句话,不然可能会被制裁。
有用的编译参数
Fsanitize
在编译时加入参数 -fsanitize=address -fsanitize=undefined
,可以合并写作 -fsanitize=address,undefined
。
前者用于检测越界、释放后使用等与内存有关的,后者用于检测如有符号整型溢出等未定义行为。
使用这两项工具可能会使得程序效率降低,当测试效率时应当不加入此选项。
推荐 在任意时候都是用 fsanitize 编译你的程序测试样例,即使其返回了正确的输出。
务必 最终使用不含任何 fsanitize 选项的编译命令测试程序,以防止由于开启 fsanitize 造成的行为不一致。(原文评论区给出理由:有时候 sanitize 会重新染色内存来排查问题,有极低概率会把本来的错误消除。)
STL 检查模式
-D_GLIBCXX_DEBUG
开启 STL 的检查模式,会降低程序效率,但是能够检查一些问题。例如:线性检测 lower_bound
是否有序
这我没试过,不知道有没有用。
其它
-Wall -Wextra
开启常用的警告。-Wshadow
开启变量重名检测。
考前一周
不要 学习新的算法。
不要 修改你平日养成的习惯(码风?编辑器?)
可以 考虑编写一些 模板。
几个 Common 的问题:
- 几个 tarjan 算法,会写吗(@alpha)
- 会树 Hash 吗(NOI 2022 P4)
- 会写 Z-Algorithm 和 manacher 吗?一遍写的对 SAM 吗?
- 会写 Pollard-Rho 吗?
可以 考虑去回顾以前做过的题,或者随机看点课件。
应该 去调整你的作息,考前一周 不应该 在 00:00 后还不睡觉,不要 在 01:00 后还不睡觉。失眠和焦虑是正常的现象,但你仍然应该去调整你的作息。
可以 去和你想要说话的人聊天、说话,可以 去想你喜欢的人,可以 做一些你想要做的事情,但不要让你的心情过于激动。
不应该 去在这个时间点思考比赛失利会怎样,不要 在比赛前自暴自弃。
考前一晚
如果存在,你 应该 参加试机活动。不要错过任何可以适应考场设备的机会。
你 不要 在这一天食用你不经常食用的食品。
你 应该 尽早入眠,但如果你失眠,不要 过于焦虑。一晚上的失眠通常不会显著影响你第二天上午的精力,just relax。
比赛策略
必须 阅读所有的题目
应该 在除极特殊情况(NOI 2022 P3)情况下,为每一个题编写代码。
应该 在每个题上投入不少于 20 分钟思考,考虑各档部分分。
应该 在编写消耗超过 30 分钟的题目前整理做法,并验证正确性。
不应该 在有其它事可做(例如其它题目的部分分)时,编写消耗超过 90 分钟的代码。
不要 编写会消耗超过 150 分钟(即 2.5 小时)的题目。
不应该 在任何一道题目花费超过 150 分钟(即 2.5 小时)。
不要 在任何一道题目花费超过 210 分钟(即 3.5 小时)。
不建议 在比赛结束前 15 分钟编写任何新代码。此时间可以用于检查。
不要 在比赛结束前 5 分钟修改任何代码,除非经过备份原来代码,并且确切知道问题,且容易纠正。
必须 在距离比赛结束 15 分钟时,首先 备份 你的代码,然后检查 所有 题目与子文件夹的 名称,使用 题面规定的编译选项 编译测试所有代码,并测试 所有 的附加样例文件。
必须 进行空间限制的检测。
不应该 在比赛时编写平时从未编写过的代码。
不要 在编写没有信心完成的代码。
不要 依赖于随机化,奇迹不会发生。
应该 在编写代码用时超过预期时,重新评估是否能完成。
心态
做好做不出一道题的准备。
做好得到接近满分的准备。
不应该放弃任何一点部分分。
细节
记得写
freopen
如果使用
cin/cout
,记得关闭同步流,记得不要再使用scanf/printf
,特别是getchar
。如果使用
fread/fwrite
,记得考虑这部分空间,以及在程序结束之后flush
,特别是一些特判的地方。