OI 竞赛究竟发生了什么

OI 竞赛究竟发生了什么?





蒋炎岩

南京大学计算机科学与技术系

jyy@nju.edu.cn

蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

观点

事实:OI 竞赛变难了

  • CSP/NOIP 难度连年增加
  • 省选/NOI 难度增加更离谱
  • 教练连题解都看不懂了 (你们感到不安吗?和自己和解了吗?)

原因 (1): OI 竞赛在成为 “数学竞赛”

  • 内卷的必然结果
  • 在划定的知识范围内考察观察 + 推导的能力

原因 (2): OI 竞赛在成为 “社区 (圈子) 竞赛”

  • 开源开放社区 → 知识体系发展 → 退役选手命题的必然结果
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

例子:如果你想进省队 (2024)?

首先,简单题不能翻车: wind

  • 也不那么 “简单”,放到 20 年前,难度是 NOI+/IOI 了
  • “简单” 的原因是所有技术处理都很标准

技术处理

类似的,Day2 P1 能推对,得到 200 分

  • 但这进不了省队。还必须 “基本做出” 一个更难的题
  • 观点:OI 竞赛 = 数学竞赛 + 社区竞赛
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

例子:如果你想进省队?

稍微难一点的题得能做出来: xor

  • 形式标准,处理上稍难一些:在 的前提下最大化

技术处理

  • 切入点:radix trie (字典树) 上的意义
    • 这是 “标准” 的,但如果完全没做过类似的题,难度陡增
  • 还需要找到一些重要的性质
    • 如果 的一个 bit 选 0,相当于左子树 “没有影响” (退回到了特殊情况)
    • 如果 的一个 bit 选 1,右子树变成了特殊情况
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

例子:如果你想进省队?

如果翻车了,可以选择做另一个题: timeline

  • 有一些线索:TAOCP Vol. 3; Balance Scale
  • 相比 xor,如果完全没做过,这个难度要大一些

技术处理

  • 切入点:DAG 计数
    • 真正的容斥原理: 表示 是 “sink” 节点的 DAG 集合;然后化并为交
    • 选手必须能独立、明确地推导它,而不是似是而非的 “理解”
  • 剩下就是一个组合计数 ( 加一个维度 表示分段数)
    • 运气不好拿不到满分
    • 但出题人应该是希望大家能过的
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

这意味着什么 (1)

对于一个天赋不是超一流的选手

  • 没有做过 radix trie 和相关的习题 = gg
  • 没有做过 DAG 计数和相关的习题 = gg

两个要素

  • 数学竞赛:执行对数学性质猜想、观察、推导的能力
    • 数学 = 题目难度难以把控;例子:对你来说都是做不出的题
  • 社区竞赛:流行的解题技巧必须不遗漏地掌握
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

这意味着什么 (2)

能稳定做出 P2 难度级别题目的选手

  • 基本锁定一个省队名额
    • 江苏省选线:~350 (1.5 个 P2 题)
    • 也具备冲击 NOI 金牌的能力
  • 难度在于稳定:选手容易有短板/翻车
    • 致命问题:你们不知道怎么训练出能全面适应当今题目难度的选手

来自教练们的观察:选手 “断层” 现象明显

  • 基础题 (套模板) 都学会了,提高难度 = 立即崩盘
    • 在知识体系和推导能力建立前,盲目地训练真题收效很小
    • 繁荣的假象:“都是浪费时间,刷 OI 题比在教室坐牢好多了”
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

训练适应当今题目难度的选手 (@CommonAnts)

OI 竞赛中常见的情况:(1) 瞪眼法猜性质 (2) 式子不知道如何推 (3) 无法理解题解里的 “注意到” “发现”……

数学竞赛 + 社区竞赛

  • 找到研究对象的数学表达
  • 在数学表达 (尤其是代数表达) 基础上推演结构和性质
  • 利用数学性质使用适当的数学工具处理

如果希望培养高水平的选手 (NOI)

  • 随机刷题 + 看题解 ❌ ← 大部分人倒在到这个阶段
  • 学会推理,并补全自己的 “推理工具箱”,并尝试推广 ✅
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

结论

残酷的真相

  • 以在座各位的能力,只能做普及和非技术性的工作

摆正心态

  • 仍然可以做很有意义的事:发掘有潜力的选手、保护他们的编程兴趣
    • 写出正确程序和调试的正确方法 ✅
    • 现代编程语言 (C++)、现代编程工具 (vscode) 的使用 ✅
  • 不要做的:试图做 “竞赛培训”
    • 这不是你们干得来的事 ❌
    • “能干” 的先决条件:能驾驭选手的数学知识和技巧体系
蒋炎岩 (南京大学计算机科学与技术系)
OI 竞赛究竟发生了什么

例子:toybox (一个小礼物)

git.nju.edu.cn/jyy/toybox (MIT Licensed)

  • 让学 C++ 同学也偶尔可以快乐编程一下
#include "toybox.h"

int main() {
    toybox_run(1, [](int w, int h, auto draw) {
        static int t = 0;
        t++;
        for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                draw(x, y, '0' + t % 10);
            }
        }
    }, nullptr);
}
蒋炎岩 (南京大学计算机科学与技术系)