专栏文章

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

算法·理论参与者 45已保存评论 50

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
50 条
当前快照
2 份
快照标识符
@miijbxs5
此快照首次捕获于
2025/11/28 15:22
3 个月前
此快照最后确认于
2025/12/01 21:35
3 个月前
查看原文
感谢 R_shufflefnoihzhyan提供大量建设性意见。
upd 2025.11.27: 感谢评论区的同学及某位不愿透露姓名的热心选手指出本文的纰漏并补充修正。
本文可能不够详细,但写的都是笔者认为非常重要的东西。
写这篇文章的初衷是给 GFMT 的小朋友们,弥补不负责的队长在 CSP 前忘记教他们用 NOI Linux 的错误/dbq
希望可以帮到更多的人,避免一些技术问题导致的挂分。毕竟,OI 生涯短短 5 年,错过就真的是错过了。

赛前(Day -INF ~ Day 0)

学英语

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

NOI Linux 操作

请询问你的学长/教练,机房有没有装 NOI Linux,自己操作一遍比看什么教程都管用。 如果没有,最好在自己电脑上装一个虚拟机,提前熟悉系统!
  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)[0,n) 内的随机整数。
    • 暴力程序,保证一定没错的那种
    • 对拍程序(注意 linux 对比文件是 diff 而不是 fc
    C
    #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

比赛当天

交通

  • 提前规划交通,考虑堵车、停车等问题。
  • 提前 30min 到考点,预留调整状态的时间。

携带物品

  • 准考证(密码条)、身份证
  • 文具
  • 水和食品
  • 衣物
  • 某些比赛可能有“诚信承诺书”一类物品,注意看比赛须知。

调整心态

  • 提前至少 30min 到考点,给自己留下排除杂念,调整状态的时间。
  • 不要高估/低估题目难度、自己水平和大众水平。
  • 不要给自己定“目标”/“底线”,告诉自己“平常心,尽量拿分就好”。
  • 不要想考完以后的事情,不管是 whk 还是名次结果。

赛前检查

  • 检查好鼠标键盘和系统!!!
  • 理论上“开考前不能触碰鼠标键盘”,但 BJ 的 CSP、NOIP、省选 一般没有试机赛,允许考前操作,甚至可以打板子。(因省份而异,某些省对此要求非常严格)
  • APIO、NOI 等有试机赛的比赛,一般要求开考前不操作机器。

赛中

下面以 CSP/NOIP 为例(毕竟受众主要是参赛经验少的小朋友)
下面多数经验适用于任何比赛,少数仅适用于 CSP/NOIP 或 省选/NOI
其实是作者懒得重新写了(bushi)
某不太懒的热心退役选手进行了一些调整
比赛策略因人而异,需要在日常模拟赛中不断调整,找到适合自己的。 你不应在正式比赛时使用你从未使用过的策略!

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

  • 通读所有题目!简单判断题目难度,决定开题顺序(尽量正序,视情况交换 t1/t2,t2/t3)。
  • 仔细看题目描述!包括但不限于 整数、是否保证图联通、特殊数据范围、t1=t2|t_1|=|t_2|...
  • 手玩小样例看自己有没有读对题。

想题(连续不应超过 20-30 min)

  • 如果你在平时的模拟赛中过题数一般 >1>1 ,正常读题的时候就应该会签到了,要再仔细想一下实现,简单记录流程。
  • 模拟之类实在想不清细节可以先搭框架,边写边想,别干坐着浪费时间(信友队 noip2024 模拟赛 t1)。
  • 一下想不到正解的话,不要慌张,踏实从部分分开始想。
  • 转化操作,变成一些“等价”问题,寻找性质。
  • NOIP 非省队省一及以下水平可做题 一般就是 dp、板子、式子/性质题,可以从这些方面入手思考。
  • 熟悉 NOI 大纲,当你在 NOIP/CSP-S 中需要使用 >7>7 级算法时,请对你的思路进行更严格的检查,确认自己没有假或想复杂。
  • 猜结论/性质后尽量尝试形式化证明再开写,否则你挂样例时大概率不知道自己是写挂了还是假了,容易被搞心态(注意:是你猜结论而不是“骗分”之后,也就是说你的期望正确率是1)。
  • 不要一个题卡太久,没思路的时候先写暴力。
  • 会了期望得分较高的做法尽量开写,不要先放着去想其他题。

写题

  • 注意结构,别写成乱七八糟的一坨。
  • 适当写点注释提醒自己,别写着写着就忘记在干什么了。
  • 注意细节 & 判断条件,写之前要想一下并且记录下来。
  • 不要删除大段代码!不要替换/剪切任何文件!

调题

  • 写完先通读一遍代码,此时应该可以发现一些逻辑上的错误。
  • 分块调试,即使很简单的函数也要检查一下,避免出现打错等问题。
  • 输出中间变量,手模样例,暴力对拍。
  • 仍然是不要慌张,冷静下来仔细想想,相信自己肯定能调出来。
  • 学会使用查看时间/空间的代码/命令,避免对一道题虚空卡常/卡空间。同时应考虑到考场提供的电脑和评测机的差异,对自己写的东西以及复杂度要有信心。
  • 即使过了样例,也要再检查两遍!
  • 测试足够多组小样例,以查出各类细节/边界问题。
  • 测试一下极限数据,会不会 RE/TLE(注意大样例不一定给满)。
  • 多测在每组测试前逐个把能 O(n)O(n) 清空的东西全清了,不管你觉得它“有没有必要”清空,多出来那点时间和代码量的损失远低于少清一个该清的数组可能带来的后果。
  • 多测尽量把手搓小样例放在一起跑一次,可能有奇效(比如检查出清空没清完)。
  • 写完题后把每个数组的空间逐个计算一遍,防止开小,事实证明纯随的极端数据很容易达不到某些上限(注意是写完题后而不是整场结束前,因为那时你对这道题的思路更清楚)。
  • 务必在调完后,使用标准编译选项编译你的程序(题面中写的不带 fsanitize 的)。

优化

  • 签到打完,暴力写完,考虑优化。
  • 复杂度瓶颈在哪里?能否优化?
  • 傻瓜 dp 式子?能少几维状态吗?
  • 一定不优的无用状态?
  • 什么信息是核心的、重要的,能否压缩状态?
  • 好像无处优化了,再猜猜结论、推推性质?换个角度思考?

骗分 & 卡常

  • 要知道常见的一些东西的常数,比如能用 priority_queue 就不要用 set
  • 可以尝试一些非常规方式优化常数,同时要从信息本身出发(类似信息熵理论)。
  • 注意:模数记得设为常数(如果可以),不然你的代码取模效率会慢一倍!
  • 敢于乱搞,包括但不限于一些 O(ans)O(ans) 做法,正确性不保证的贪心,复杂度上限非严格做法,以及不可以总司令。
  • 学习使用 clock()/CLOCKS_PER_SEC ,会使程序一定程度上变慢,但有时有奇效。
  • 测试点分治时优先使用顺序为:正确性和复杂度均有保障做法 >> 正确性有保障,复杂度不正确但上限非严格做法 >> 贪心(如果时间复杂度很好的话可以跟上一项拼,快到时限的时候没跑完直接用贪的)>> 不可以总司令。
  • 学习模拟退火等随机化算法

检查(结束前 10 min)

  • 除非有信心一定能调出来/对调的东西比较有思路(具体情况具体分析),否则不要再写新东西(即使如此,5 min 是底线)。
  • 检查提交系统内的代码是否是最新修改的版本!(如果是用文件夹提交的省份,请仔细检查文件夹结构 & 名称,代码文件名 & 扩展名)
  • freopen & 文件名?
  • long long 和取模?
  • 算算空间会不会 MLE?
  • 调试信息是否删除?
  • 数据点分治有没有 exit(0)?namespace 有没有写混?

其他注意事项

  • 不要随便删代码,随时保存、备份
  • 不要清空回收站,恢复文件的时候手稳一点。
  • 注意时间分配,不要在一道题上花费过多时间。
  • 遇到突发情况不要慌,及时找监考老师。
  • 必要的时候上个厕所冷静一下。

赛后

  • 尘埃落定,别忘带东西()
  • 如果你的心理调节能力不强,省选/NOI day1结束后尽量不要预估/查询大众分/队线(省选建议结束后立即带耳机并迅速离场以规避议论老哥),省选 day1 后不要进行任何自测,默认你写的分拿全了。如果对 day1 不放心可以 day2 采取稳健型打法。
  • 虽然肯定会紧张,但是尽量稳定点别崩(崩溃也没用)。
  • 反思总结,哪些错误是不该犯的,哪些分数是本该拿到的,反应出了哪些问题。

考场上最重要的是相信自己,相信自己能想出来,能写出来,能调出来。
做的顺别放松,做的不顺也不要慌,尽力而为就好。
不管你是在什么比赛前看的这篇博客,祝你 RP++!

评论

50 条评论,欢迎与作者交流。

正在加载评论...