OI 比赛技术动作 & 注意事项集合

· · 算法·理论

底板:NOIP 注意事项梳理 by Cindy_Li 2024.11

参考:OI 赛制比赛 emergency kit by Qingyu

感谢 @R_shuffle @fnoihzhyan 提供大量建设性意见。

upd 2025.11.27: 感谢评论区的同学及某位不愿透露姓名的热心选手指出本文的纰漏并补充修正。

本文可能不够详细,但写的都是笔者认为非常重要的东西。

写这篇文章的初衷是给 GFMT 的小朋友们,弥补不负责的队长在 CSP 前忘记教他们用 NOI Linux 的错误/dbq

希望可以帮到更多的人,避免一些技术问题导致的挂分。毕竟,OI 生涯短短 5 年,错过就真的是错过了。

赛前(Day -INF ~ Day 0)

学英语

虽然 NOI Linux 应当是中文的,但里面的软件默认都是英文的。且万一你遇到了一个纯英文的 NOI Linux 系统呢?(可以找监考老师,但你自己看懂不就没事了吗)

NOI Linux 操作

请询问你的学长/教练,机房有没有装 NOI Linux,自己操作一遍比看什么教程都管用。 如果没有,最好在自己电脑上装一个虚拟机,提前熟悉系统!

Windows 下 NOI Linux 虚拟机安装指北

参考:NOI Linux 2.0 食用指南 by dengyaotriangle

  1. 基础操作
    • 不要把文件存在桌面!不要把文件存在桌面!不要把文件存在桌面!
    • 具体的,找到“主文件夹”,在里面创建一个文件夹,用来存放你的所有文件。
    • 文件操作的终端命令可学可不学,毕竟 NOI Linux 右键啥都能干。但如果你是终端编译运行,必须知道 cd 切换目录。
    • 日常中没有机会使用 NOI Linux 或得知考点没有 NOI Linux 的选手请提前熟悉 Linux 下常见RE/CE错误。(一个邪修做法是多翻别人的游记,每年都大概率能翻到几个死在神秘 RE 上面的)
  2. Coding
    • 集成开发环境:Codeblocks、Geany
      • 用 Codeblocks 的人很多,毕竟跟 Dev-C++ 比较像,图形化界面操作容易。但本人 Codeblocks 用一次崩一次,所以建议多学会几种编辑器的使用,考场出意外还能换。
      • Codeblocks 修改默认编译器:
      • 打开 Codeblocks,点击“工具”->“选项”->“编译器”。
      • 把“编译路径”改为虚拟机上的 g++ 路径,比如 /usr/bin/g++
      • 学会配置编译选项,不要勾选,要在“其他编译器选项”里自己写。
      • 如果下方调试框不见了,按 F2。
      • 字体大小在 settings——editor——general settings 里调。
    • 文本编辑器:Vim、Emacs、Gedit、Sublime Text、VS Code
      • VS Code 使用教程 by 樱雪猫
      • Sublime Text 使用体验跟 VS Code 差不多,反正场上不能装插件,但内存占用会比 VS Code 低。
      • 其他几个的话,5202 年了,大概没什么人在用了...谢罪,有人用但笔者不熟,有需求者请移步其他教程/bx
      • 注意到这几个都只是编辑器,需要终端编译运行(右键“在终端中打开”,或直接找到 Terminal)。
  3. 编译运行
    • 编译命令:g++ -o abc abc.cpp -std=c++14 -O2
    • 运行命令:./abc
    • 输入输出重定向(写在主函数开头):
      • freopen("abc.in","r",stdin);,将标准输入重定向到文件 abc.in
      • freopen("abc.out","w",stdout);,将标准输出重定向到文件 abc.out
    • 常用编译选项
      • -std=c++14 -O2,开启 C++14 标准和 O2 优化,是官方评测的编译选项。
      • -Wall, -Wextra ,开启更多警告。
      • -fsanitize=address,leak,undefined,查数组越界/未定义行为。注意仍有小部分错误可能无法查出,如 string 访问越界,不可过分依赖此选项。同时,开启此选项后程序运行效率无意义,所以应关闭此选项后再测试运行时间
    • 常用终端指令
      • cd BJ-001\abc,进入文件夹; cd .. 回到上级目录。
      • ulimit -s 1048576,开栈空间(单位是 KB)。
      • ulimit -v 1048576,开内存空间,务必用题目规定的空间限制测试。
      • time ./abc,查看程序运行时间。
      • size ./abc,查看程序内存占用(单位是 B)。
      • 按上箭头,复制上一条命令。
      • Ctrl + C,强制终止程序。
      • diff abc.out abc.ans -Bb,对比输出文件和答案文件是否相同,-Bb 忽略行末空格和文末回车
  4. 对拍
    • 数据生成器,考场上一般就是根据数据范围随机生成
      • mt19937 rnd(time(0)),随机数生成器,范围是 unsigned int,rnd() % n 可以生成 [0,n) 内的随机整数。
    • 暴力程序,保证一定没错的那种
    • 对拍程序(注意 linux 对比文件是 diff 而不是 fc
      #include<bits/stdc++.h>
      #define il inline
      using namespace std;
      int main()
      {
      system("g++ qwq.cpp -o qwq -O2"); //编译三份代码
      system("g++ std.cpp -o std -O2");
      system("g++ data.cpp -o data -O2");
      for(int i=1;i<=10000;i++)
      {
          cerr<<i<<endl;
          system("./data");// 生成数据,输出到 qwq.in
          system("./std");// 运行暴力程序,从 qwq.in 输入,输出到 std.out
          system("./qwq");// 运行自己的程序,从 qwq.in 输入,输出到 qwq.out
          if(system("diff std.out qwq.out -Bb")) break; 
      }
      return 0;
      }
  5. 调试
    • u1s1,我自己不会用 gdb,且我熟悉的人好像没几个用的。
    • 但有个小朋友问这个,所以我放个教程,有需要的自己研究吧。
    • GDB 奇技淫巧 by yiming564

比赛当天

交通

携带物品

调整心态

赛前检查

赛中

下面以 CSP/NOIP 为例(毕竟受众主要是参赛经验少的小朋友)

下面多数经验适用于任何比赛,少数仅适用于 CSP/NOIP 或 省选/NOI

其实是作者懒得重新写了(bushi)

某不太懒的热心退役选手进行了一些调整

比赛策略因人而异,需要在日常模拟赛中不断调整,找到适合自己的。 你不应在正式比赛时使用你从未使用过的策略!

读题(20 min 左右,不超过 30 min)

骗分 & 卡常

检查(结束前 10 min)

赛后

考场上最重要的是相信自己,相信自己能想出来,能写出来,能调出来。

做的顺别放松,做的不顺也不要慌,尽力而为就好。

不管你是在什么比赛前看的这篇博客,祝你 RP++!