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

· · 个人记录

这里面可能有很多不准确甚至不正确的地方,欢迎来 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. 调试语句有没有删,或者用 #ifdef 和 endif 括起来?
  3. 你的文件名是否正确?存储位置是否正确?
  4. 保存一下 编译一下 是不是都能过编译?
  5. 你有哪些程序没写?把你的暴力程序改成要提交的程序的名字。
  6. 你有哪些写了正解和暴力的程序没有对拍?拍一下。

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

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

考试结束前 3min

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

保存你的程序。

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

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

考试结束前 1min

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

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

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

考试结束

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

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

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

祝你考试成功。