比赛进行的时候你应该干什么?

· · 个人记录

这里面可能有很多不准确甚至不正确的地方,欢迎来 D 我 QAQ

有什么想补充的欢迎写到评论区!

相关好文推荐:

如何在联赛和省选中进行暴力和骗分?——听取 MLE 声一片

NOIP 24 小时——华法琳血怒 / UruhaRushia

写代码 / 考场时需注意的细节——Pethly_Cat

比赛注意点及技巧(云剪贴板)——Eason_AC

一些竞赛注意点及技巧——End_Dragon

如何干爆旁边人的心态(雾)——ClCN / Sol1(提醒:挂上来这篇文章不是让你祸害别人的,你可以按照上面的情况来想办法反制)

标题:比赛进行的时候你应该干什么?

未进入赛场前

  1. 联系你的教练,问问赛场上能不能带水和食物。如果让就跳转到 2,否则从 3 继续。
  2. 购买好水或饮料,咖啡(如果你需要带的话),一些糖果和巧克力等,让你在比赛的时候不至于渴死或累死(x)让你在比赛的时候可以保持精力和体力,以及让你有上厕所的时间。别带薯片榴莲酸辣粉这种有浓郁味道或很大响动的食品什么的,这样不好。
  3. 一定记住你的比赛时间。如果你看到本文的时间距离你比赛的时间剩下一周之内,跳转到 4,否则跳转到 5。
  4. 不要追求快速的学习了,没有任何意义。越是急越容易挂分。
    把模拟赛打好,重点练习暴力、模拟和部分分、骗分,这些对你的考试作用更显著(原因显然,你在考试之前现学的数据结构和算法什么的并不一定可以大于 80\% 概率写出来,不如把该拿到的分拿到)。
    把你学会的、理解了的算法和数据结构什么的再去看一看。已经会了的东西不要忘记。
    改题。复盘,改题。一定要改题,你需要抱着「考试的时候可能会考到出过的题」的心态去对待你做的题和模拟赛。
  5. 把大纲看一遍,看一下你有哪些东西还不会。若时间够用,建议系统的学一遍;若时间不够,问一问网上或者学长你不会的那些东西里什么出现频次最高,然后你就针对性开始学习。

特殊内容:关于报名课程
前排说明一下,没人让我打广告。
我个人建议,

如果你的学校很弱又没有组织集训之类的,你又很想冲刺,建议洛谷网校,不要把你自己看的有多么厉害,除非你真的很厉害,这个由你自己评估,我尊重每一个人的选择。自学成功的并不占多数。
如果你完全自学 1 年内达到了能冲刺省选的水平,我建议你自学,你很有希望,认真搞下去你能登顶。

如果你的学校有组织集训,你又很想冲刺,建议跟住学校,谁都知道网课的效率可以多么低下。

如果你压根没有冲的意愿,抱歉,我建议你别交报名费。

比赛前

别听老师搁那吵吵不要动鼠标键盘。你一定要动一动,但是啥也别打开什么的。你一定要测试一下你的设备。如果发现故障就立刻报告,别憋着。不要因为设备问题搞崩了你比赛的心态。

然后把你的键盘放到一个舒服且合适的位置。把你带进去的食物和水放到一个你认为舒服且合适的位置。

静下心,给自己一个浏览一下整个四道题的念头,别干傻事。

想一下对拍怎么写。别忘了。

比赛开始时

首先你要先看一下 CCF 给你的 pdf 文档。一定要看四道题和编译选项。

编译选项一般是 -O2 -std=c++14。你可以记不住,因为你可以复制。一定要看!一定要看!一定要看!

四道题全都浏览一遍,把能骗的分骗出来,暴力程序(指 4 个,实际上如果你写不出来某道题的暴力就别写了,每道建议 20min 之内草过去,不建议 30min+)写好之后再去研究正解。如果一道题你搞了 \rm1h 还没过小样例,醒醒吧,不要妄想着你能把这道题做的很好,你可以不要搞了,去把暴力和骗分打出来。

upd:由于和机房同学吵了一架,我把我的观点说出来:

你写的暴力有什么用?我随便列出来两条

首先你必须要写对拍。除非你实力达到了一定水平能保证说这种破题能一遍 A 穿,你必须要写一个对拍拍出来可能的错误。不对拍这个坏毛病葬送了竞赛生涯的好多人,除非说你一定能过,否则一定要对拍。而写对拍就需要用到一个暴力程序,你不得不写。

你不会做的题需要骗分,你需要打一个暴力程序。你总不能说这分你不要了吧?你用写暴力的时间能 A 一道题吗?不能吧?你也必须要写。甚至我的血淋淋的教训就是我 t1 花了很长时间(大于考试时间的一半)来写,t2 简单分讨了下,然后剩下的暴力都没打,CSP-S 才一百多分,写的 t1 三十分都不到来着。

反正我都要退役了,我也干涉不了你们什么,你们自己衡量吧。

比赛进行时

编译命令

编译选项一般是 -O2 -std=c++14。你可以复制。一定要在编译的时候加上。

你可以看看这个:https://zhuanlan.zhihu.com/p/393419013

  1. -D[str]:例如说 -DONLINE_JUDGE 就相当于编译的时候 #define 了一个 ONLINE_JUDGE。你可以在输出中间变量的前后加上 #ifdef xxxxxx#endif,省着你忘记删除之类的;

  2. -Wall:不仅报编译错误,还报警告,一定要背下来(我是这么记的:-W + all-W(arning) + all));

  3. -Wextra:警告一些更不易发现的错误,建议背下来(我是这么记的:-W + extra-W(arning) + extra));

  4. -fsanitize=address(仅 Linux 有效):检查一些与地址相关的错误,如下标越界等,建议背下来,但是我没背下来;注意使用这个编译出来的程序效率没有意义(指开启这个编译选项会影响程序执行效率,下同);

  5. -fsanitize=undefined(仅 Linux 有效):检查代码中的未定义行为(UB)。因为编译命令里有一个 -O2 所以你的未定义行为导致的问题可能会更加严重和突出,强烈建议背下来(我是这么记的:-f + sanitize + = + undefined-f + 消毒 + = + 未定义);注意使用这个编译出来的程序效率没有意义

upd:由于和机房同学(初中一二年级)吵了一架,我把我的观点说出来:

为什么你要去记这一部分东西

你知不知道啥是 UB? 你能不能人眼检查出来 UB? 你能不能一次就不写出来任何 UB?

不能?背下来检查 UB 的东西,因为开着 O2,UB 会让你死不瞑目。

运行程序

name arg1 arg2.......

其中注意一些读入和输出文件的不用 freopen 的方式:name < name.in > name.out

其中 < name.in 表示从 name.in 读入,> name.out 表示输出到 name.out

参数里还可以放奇怪的东西,例如说 gen 100 50 > name.in。在讲对拍的时候会提到。

对拍

强烈建议,写完暴力和正解的那一刹那立刻去拍!

忘记拍…这个我倒是没怎么遇到过的说x
这么说的话也可以吧 没准就能调出来呢 就是对心脏不太好(
                      ——Sol1(ClCN)

对拍由 4 部分组成:暴力程序(正解程序,但是你在考场上不一定能写出来符合一切规范的正解)sol.cpp,选手程序 name.cpp 和数据生成程序 gen.cpp

把你的数据生成器稍作修改

稍作修改你的 gen.cpp:把 int/signed main () 改成 int/signed main (int argc, char** argv)argc 是传入参数的数量,argv[][] 是你传入的所有参数。然后写一个 eval 函数:

inline int eval (char* arg) {
  int l = strlen (arg), x = 0;
  for(int i = 0; i < l; i++) x = x * 10 + arg[i] - '0';
  return x;
}

或者直接使用 C++ 自带的函数 int atoi (const char* str)
或者 sscanf (str, "%d", &x);

然后在主函数里写

int n = eval (argv[1]), m = eval (argv[2]);

就能实现不需要反复来编译 gen.cpp 或者手动输入来修改数据规模,若要使 n = 100,\;m = 50 并输出到 name.in 里,就可以使用 gen 100 50 > name.in

参数之间用空格分隔,gen 是运行文件名,也是第一个参数(第 0 个),100 是第二个参数(第 1 个)……

对拍脚本

每次对拍之前我都建议你编译一下:g++ name.cpp -o name -O2 -std=c++14 -Wall -Wextra

接下来运行数据生成程序:gen [args] > name.in

接下来运行选手程序:name < name.in > name.out;如果你的程序里有了 freopen 就使用命令 name

接下来运行暴力程序:sol < name.in > name.ans;如果你的程序里有了 freopen 就使用命令 sol

最后对比差异:diff name.out name.ans

在 NOI Linux 上的实现:无限循环对拍直到出错 喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵
在 NOI Linux 上的实现:无限循环对拍直到出错 喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵
在 NOI Linux 上的实现:无限循环对拍直到出错 喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵

上厕所

我必须把这个单独列出来。

首先你可能无法保证 \rm4h 的高强度集中精力,然后你在打了很长时间之后可能会精神很疲惫,建议你在考试 \rm2h 左右、完成一个阶段任务(例如说写出来某函数)之后立刻报告,去上一个厕所。时间可以按照你自己的感受来调整。

考试结束前 10min

你要是感觉马上就能调出来一个程序,别调了,你调不出来。
如果你有把握翻盘,你加油 qwq(「我倒是觉得不一定 最后两三分钟翻盘的我看见不少的」——happydef,感谢)

除非说你就差一个字就调完了,你既然已经调了很长时间了,你还需要调很长时间。

要是自己对自己有强大的自信可以无视。

检查:

  1. freopen 加了没?错了没?
  2. 调试语句有没有删,或者用 #ifdefendif 括起来?
  3. 你的文件名是否正确?存储位置是否正确?
  4. 保存一下 编译一下 是不是都能过编译?
  5. 你有哪些程序没写?把你的暴力程序改成要提交的程序的名字。
  6. 你有哪些写了正解和暴力的程序没有对拍?拍一下。

为什么在结束前 10min 要对拍?有时间对拍吗?你有这些问题的话看看后面

  1. 你是不是没有看到「写了正解和暴力的程序」的这个条件?对拍程序熟练的话 1min 就能写好,有写好的可以直接用
  2. 如果数据就是很少的数,例如说 nm 这种,很好生成,不用 2min 就能写完。运气好你能拍一百来组。
  3. 实际上还是要看你的个人情况,但是我建议你在力所能及的范围内拍一下

考试结束前 3min

再次浏览上述内容。编译一下。编译一下。

保存你的程序。

你再做什么其他的东西已经没什么意义了。拍都没时间了。

放松放松,你已经尽力了。

考试结束前 1min

放松一些,准备迎来终章。

关掉你的编辑器窗口,关掉所有占用你程序的东西。

放松一些。你已经尽力了。回去吃一顿大餐吧。疫情,两点一线

考试结束

别动电脑了。收拾好东西。这次的考试就结束了。

放轻松,不要影响到你的生活。

然后或许还要下一阶段集训,或许要去学文化课,加油。

祝你考试成功。