OI Wiki.pdf
version: 18.12-874a2f8
OI Wiki Team
2018 年 11 ⽉ 30 ⽇
iii
前⾔
声明
OI Wiki 致⼒于成为⼀个免费开放且持续更新的知识整合站点,⼤家可以在这⾥获取关于 编程竞赛 (compet-
itive programming) 有趣⼜实⽤的知识,我们为⼤家准备了竞赛中的基础知识、常⻅题型、解题思路以及常⽤⼯
具等内容,帮助⼤家更快速深⼊地学习编程竞赛。
建议访问 https://oi-wiki.org 以阅读持续更新的内容。
OI Wiki 除了代码部分均采⽤ (Creative Commons BY-SA 4.0) 知识共享署名 - 相同⽅式共享 4.0 国
际许可协议 及附加的 The Star And Thank Author License 进⾏许可。换⾔之,使⽤过程中您可以⾃由地共
享、演绎,但是必须署名、以相同⽅式共享、分享时没有附加限制,⽽且需要为 GitHub 仓库 点赞(Star)。
OI Wiki 源于社区,提倡 知识⾃由,在未来也绝不会商业化,将始终保持独⽴⾃由的性质。
在编写过程中,作者听取了⼤量同学的意⻅和观点,并尽可能地将各种观点统⼀在项⽬的框架下。但是我们并不
能保证内容中没有对其他组织的误解或偏⻅,⽽内容的正确性也没有经过权威审查。我们亦⽆⼒确认⼿册是否违反了
读者所在地的各种法规,或是⼿册内容是否会对读者⾝⼼健康产⽣不良影响。对于未经授权的传播⽽产⽣的各种问题,
我们概不负责。
如果您有任何问题或建议,可以通过 Github Issues,讨论群,或发邮件到 hi@oi-wiki.org 来联络我们。
欢迎⼀起来完善 OI Wiki!
iv
致谢
很荣幸在此感谢那些帮助我们的⼈们。
我们要感谢 CTF Wiki,本项⽬是受他们启发。另外在编写过程中我们参考了诸多资料,在此也⼀并致谢。
Ir1d, LeoJacob, 和 MingqiHuang 制作了这个 Pdf。
⾮常感谢⼀起完善 OI Wiki 的 ⼩伙伴们,他们充满感染⼒的精⼒和热情给了这个项⽬极⼤的⽀持:
saffah, wangyisong1996, Xeonacid, greyqz, hsfzLZH1, abc1763613206, cjsoft, frank-
xjh, i-Yirannn, Planet6174, MingqiHuang, Zhoier, LuoshuiTianyi, Anguei, Mosa-Linking,
ACodreamer, CBW2007, dsy031120, HeRaNO, StudyingFather, stevebraveman, Steaunk, billchenchina,
AndrewWayne, Dev-XYS, interestingLSY, Chrogeek, yeguanghao, LeoJacob, cesonic, Dev-
jqe, siger-young, ChungZH, HXLLL, JulieSigtuna, SysConKonn, Ycrpro, pw384, wjy-yy,
konnyakuxzy, Yukimaikoriya, ZhangBo1191, juicymio, Kewth, NiroBC, ShadowsEpic, Xarfa,
goldimax, ksyx, s0cks5, wangchong, ywwywwyww, cqnuljs, Alpha1022, 2997ms, Konano,
SkqLiao, zj713300, Siej, yjl9903, kzoacn, saotomeku, cutekibry, henrytbtrue, qq1010903229,
qq2964, shadowice1984, AljcC, DeepThink1, cquptEthan, FTYC919, Frankaiyou, GldHkkowo,
BalanceUhen, lushl9301, Enter-tainer, MingqiHuang@yandex.com, NeverBehave, Too-Naive,
VirtualHawthorn, WaterWan, sailordiary, Yukimaikoriya, Zhaoyangzhen, evrmji, gryzhmq,
pretend-fal, sunqingyanstc, akakw1。
图 1: Contributors
另外,也要特别感谢 24OI 的朋友们的⼤⼒⽀持!
最后,感谢董⼩姐,让这⼀切成为可能。
⽬录
1 简介
1.1 欢迎来到 OI Wiki。 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OI 赛制简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
1.2.1 赛事介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NOIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
省选 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
NOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
WC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
APIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CTSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 赛制介绍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
OI 赛制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IOI 赛制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ICPC 赛制 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Codeforces (CF) 赛制 . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3 其他国家和地区的 OI 竞赛 . . . . . . . . . . . . . . . . . . . . . . . . .
美国:USACO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
波兰:POI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
克罗地亚:COCI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
⽇本:JOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
台湾地区:資訊奧林匹亞競賽 . . . . . . . . . . . . . . . . . . . . . . . .
俄罗斯:ROI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
加拿⼤:CCC & CCO . . . . . . . . . . . . . . . . . . . . . . . . . . . .
法国与澳⼤利亚:FARIO . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4 其它⼤洲级 OI 竞赛 . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BalticOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
BalkanOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
CEOI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Nordic Olympiads in Informatics (NOI) . . . . . . . . . . . . . . . .
1.3 学习资源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1 在线测试 (训练) 平台 . . . . . . . . . . . . . . . . . . . . . . . . . . .
国内 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
国外 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.2 教程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
1
1
2
2
2
2
2
2
2
3
3
3
3
3
3
3
4
4
4
5
5
5
5
5
5
6
6
6
6
6
6
7
7
i
ii
1.6.3 Arbiter
1.3.3 书籍 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.4 ⼯具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.5 题集 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 常⻅错误 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 常⻅技巧 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6 评测⼯具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
⽬录
8
8
9
9
9
9
1.6.1 Cena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.6.2 Lemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
⾃⾏编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
数据格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
使⽤⽅法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
注意事项,槽点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
⾃定义校验器的编写 . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
测评时注意事项 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
诶我怎么只能看⻅代码不能看⻅每个点得多少分 . . . . . . . . . . . . . . . . 15
诶这个测评系统好难看 . . . . . . . . . . . . . . . . . . . . . . . . . . 15
诶怎么测提交答案题啊 . . . . . . . . . . . . . . . . . . . . . . . . . . 15
诶这个测评系统有没有漏洞 . . . . . . . . . . . . . . . . . . . . . . . . 15
吐槽 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.6.4 CCR-Plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.7 编辑⼯具 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.7.1 Vim – 编辑器之神 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
历史与争端 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
基础篇 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
插⼊模式 (insert) . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
普通模式 (normal) . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
命令⾏模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
可视模式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
插件篇 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
⽂件管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
美化界⾯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
启动界⾯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
⼩⽅便性插件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
配置篇 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
基础设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
快捷键设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
写代码好⽤的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
关于插件 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
关于⾼效编辑的建议 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.7.2 Visual Studio Code - 微软家的编辑器 . . . . . . . . . . . . . . . . . . 26
简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
⽬录
1.8
1.9
iii
WSL (Windows 10)
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
1.8.1 0x01 引⾔ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
1.8.2 0x02 准备 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.8.3 0x04 基础配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
更换为国内软件源 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
安装中⽂环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
安装编译环境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
1.8.4 0x05 进阶操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
安装图形环境,并使⽤远程桌⾯连接 . . . . . . . . . . . . . . . . . . . . . . 32
1.8.5 0x09 延伸内容 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
后记 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Special Judge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.9.1 Testlib
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.9.2 Lemon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.9.3 Cena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.9.4 CCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.9.5 Arbiter
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.9.6 HUSTOJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.9.7 QDUOJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.9.8 LibreOJ(SYZOJ 2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.10 Testlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.11 关于本项⽬ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2 基础部分
41
2.1 基础部分简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2 枚举 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2.1 给出解空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.2.2 减少枚举的空间 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.2.3 选择合适的枚举顺序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.3 模拟 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.4 递归 & 分治 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.4.1 递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
递归三要素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
递归式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
递归出⼝ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
界函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
递归模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
递归优化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.4.2 分治 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5 贪⼼ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.1 常⻅做法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.2 证明⽅法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.5.3 排序法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.5.4 后悔法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
iv
⽬录
code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.6 排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.1 稳定性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.2 时间复杂度 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.3 冒泡排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.6.4 归并排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
逆序对 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
参考 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.6.5 快速排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
STL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
线性找第 k ⼤的数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
参考 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.6.6 计数排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
参考 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.6.7 排序的应⽤ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7 表达式求值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.7.1 递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.7.2 ⾮递归 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.7.3 习题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.8 ⼆分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
2.8.1 ⼆分搜索 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
STL 的⼆分查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
2.8.2 三分法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.8.3 分数规划 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
⼆分法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Dinkelbach 算法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
2.9 构造 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.10 前缀和 & 差分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
2.10.1 前缀和 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
参考 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.11 ⽂件操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.11.1 ⽂件的概念 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.11.2 ⽂件的操作步骤 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
2.11.3 freopen 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
命令格式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
参数说明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
使⽤⽅法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
2.11.4 C 的 ifstream/ofstream ⽂件输⼊输出流 . . . . . . . . . . . . . . . . 58
使⽤⽅法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
模板 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3 搜索
61
3.1 搜索部分简介 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61