Useful Commands
Set memory limit: ulimit -v "${memory}"
务必使用题目规定的空间限制进行测试。该命令执行后 shell 内的程序一旦超出此内存限制便会被杀死。(教训:NOI 2022)
不要在同一个 shell 窗口内多次使用 ulimit -v
。(事实上,可以多次使用 ulimit -v
来让新的空间限制变得更小,但变得更大会发生错误。)(教训:花花 in 2023 年广东省重点中学信息学邀请赛 (GDKOI 2023) 提高组 第一试)
Set stack limit: ulimit -s "${stack_size}"
不要设置为 unlimited,防止由于栈空间溢出导致系统崩溃。(教训:有很多。)
测量时间:time ./a < a.in
获取详细信息:/usr/bin/time -v ./a < a.in
Locate Overflows/Undefined Behaviors
使用 fsanitize:
g++ a.cpp -o a -fsanitize=address -O2
g++ a.cpp -o a -fsanitize=undefined -O2
推荐在任意时候都是用 fsanitize 编译你的程序测试样例,即使其返回了正确的输出。(教训:花花 in 1116 NOIP 模拟赛)
务必记得最终使用不含任何 fsanitize 选项的编译命令测试程序,以防止由于开启 fsanitize 造成的行为不一致。(教训:陈翰飞 in NOI 2021)
开启 fsanitize 后程序效率将会有所损失,在测速时请注意这一点。
Overflows of STL Containers
使用 -D_GLIBCXX_DEBUG
编译选项可以开启 STL 的 debug mode。
在这种模式下,会进行一些 STL 相关的检查,用于帮助定位 bug。
- https://gcc.gnu.org/onlinedocs/libstdc++/manual/debug_mode_using.html
- https://stackoverflow.com/questions/14657005/where-can-i-find-more-information-about-d-glibcxx-debug-and-dndebug-flags
credits to 核仁 在 NOI2022 告诉我。
Other useful compilation flags
使用 -g
与 -O0
。credits to 日语酱。
使用 -Wall
, -Wextra
与 -Wshadow
。
The week before the contest
你不要学习新的算法。
你不要修改你平日养成的习惯(码风?编辑器?)
你可以考虑编写一些模板(https://qoj.ac/contest/1536 )。几个 Common 的问题:
- 几个 tarjan 算法,会写吗(@alpha)
- 会树 Hash 吗(NOI 2022 P4)
- 会写 Z-Algorithm 和 manacher 吗?一遍写的对 SAM 吗?
- 会写 Pollard-Rho 吗?
你可以考虑去回顾以前做过的题,或者随机看点课件。
你应该去调整你的作息,考前一周你不应该在 00:00 后还不睡觉,不要在 01:00 后还不睡觉。失眠和焦虑是正常的现象,但你仍然应该去调整你的作息。
你可以去和你想要说话的人聊天、说话,可以去想你喜欢的人,可以做一些你想要做的事情,但不要让你的心情过于激动。
你不应该去在这个时间点思考比赛失利会怎样,不要在比赛前自暴自弃。
The Night before the contest
如果存在,你应该参加试机活动。不要错过任何可以适应考场设备的机会。
你不要在这一天食用你不经常食用的食品。
你应该尽早入眠,但如果你失眠,不要过于焦虑。一晚上的失眠通常不会显著影响你第二天上午的精力,just relax。
Contest Strategy?
Warning!:(2024 Feb 29 更新)由于帮助大家训练的时间比较短,我暂时不了解大家比赛时的策略。以下策略是我基于花花(黄洛天;Luotian Huang;https://oier.baoshuo.dev/oier/59311 )在参加统一省选 2023 与 NOI 2023 制定的策略。由于每个人的比赛策略与个人便好有所不同,因此本章节仅供参考。如果我所描述的建议与你日常训练与以往比赛的习惯不同,请不要显著修改你习以为常的比赛策略。大多数人类无法在很短的时间内适应一个新的赛时策略,请注意这一点。
- 你必须阅读所有的题目。
- 你应该在除极特殊的情况(NOI 2022 P3)外为每个题编写代码。
- 你应该在每个题上投入不小于 20 分钟的思考时间,包括各档部分分。
- 你应该在编写你认为会消耗你超过 30 分钟时间的代码前整理你的做法,并花费一定的时间验证正确性。
- 你不应该在有其他事情可做时编写你认为会消耗你超过 90 分钟时间的代码。
- 你不要编写你认为会消耗你超过 150 分钟时间的代码。
- 你不应该在任何一道题目上花费超过 150 分钟,不要在任何一道题目上花费超过 210 分钟。
- 你不要在比赛结束前 15 分钟内编写任何新的代码。
- 你不要在比赛结束前 5 分钟内修改任何代码。
- 你必须在距离比赛结束 15 分钟时,首先备份你的代码,然后检查所有题目与子文件夹的名称,使用题面规定的编译选项编译测试所有代码,并测试所有的附加样例文件。
- 如果你会编写 Shell 脚本,你可以编写一个简单的脚本来复制样例为题目规定的输入文件名,并使用你的程序的输出文件与 answer 做比较。
2023.07 更新:有 self eval?省选有吗?
- 你必须使用上述命令检查你的代码,必须进行空间限制的检查。
- 你不应该在比赛时编写你从未编写过的算法。
- 你不要在比赛时编写任何你没有信心能够完成的算法。不要依赖于奇迹发生。
- 如果你发现你编写某份代码所消耗的时间超过了你所预期的时间,你应该重新评估并考虑是否仍可继续完成。
Others
- 在第一场比赛考完后,你不要去打探其他人的结果。如果比赛在当日需要处理申诉,在公示后检查自己当日的提交文件。否则,不要思考任何第一场比赛的结果(NOI 2022)。
- 你应该做好做不出当天比赛的第二道试题(NOI 2022)、甚至第一道试题(ZJOI 2022 Day 2)的心理准备。
- 你应该做好你需要拿到当天比赛几乎满分的心理准备(NOI 2014,NOI 2015,NOI 2021)。
- 在有充足的时间时,你不应该放弃任何可以获得的部分分,哪怕它只有很少的分数(NOI 2022)。
- 在比赛前,你不应该思考其他人,包括你所认识或熟悉的选手的发挥,不要揣摩 XXX 能不能过这个题,不要揣摩做不出这道题目该怎么办。考场不是给你写回忆录的地方,请尊重你在漫长的训练中换来参加考试的机会。