出题与题单管理
这一页给教练和出题人。出题比做题难,别把这两件事的难度搞混了。
一道题为什么算"能出"
在动手之前先问自己三个问题:
- 它的知识点边界清楚吗? 你能不能一句话说清"这题考什么"?说不清就是拼凑。
- 你有正解吗? 不是"应该能过",是你亲手写过并通过。
- 你能卡住错解吗? 如果任何暴力都能过,这题没有区分度。
三个都答得上来,再开始写。
题面要求
| 字段 | 要求 |
|---|---|
| 标题 | 简短明确。别用「一道题」「水题」这种 |
| 题面 | Markdown + LaTeX,讲清楚背景和目标 |
| 输入格式 | 精确到空格和换行 |
| 输出格式 | 精确到结尾有没有换行 |
| 数据范围 | 必须写,这是硬要求 |
| 样例 | 至少一组,最好带一组边界 |
| 时限 / 内存 | 正解复杂度的 2–3 倍 |
Danger
数据范围不写,等于题目不可做。
选手靠它判断复杂度、选算法、决定开不开 long long、决定数组开多大。你不写,他不是在做题,是在猜你的心思。这是新手出题人最常见、也最不可原谅的错误。
输出格式的坑
「输出一行,包含一个整数」和「输出一个整数」是两道不同的题:前者选手会加换行,后者会有人不加。如果你两者都接受,就在题面里明确写「行末有无空格均可」;如果你不接受,也明确写。
模糊的地方最后都会变成申诉。
造数据
三种数据,各有用处:
1. 随机数据
验证正确性。注意随机生成器本身容易写错:
rand()在 Windows 上范围只有 32767,直接用它当 n 会永远测不到大数据。- 随机区间要覆盖
[min, max]两端,不要rand() % n + 1然后永远取不到 0。
2. 特殊构造
这一层决定题目有没有区分度。 常见要卡的:
int溢出(答案超 2.1×10⁹)- 全相同元素 / 严格递增 / 严格递减
- n = 1、n = 2 这种极小规模
- 链状图、菊花图、完全图
- 递归深度刚好卡到栈上限
3. 大数据
验证时限是否合理。别让正解也超时——这比数据太弱更糟糕,因为选手会以为自己写错了。
文件组织
Hydro 的约定:
1.in 1.out
2.in 2.out
3.in 3.out
Warning
改完数据要重新用正解跑一遍全部测试点。改了 .in 忘了同步 .out,全世界的提交都会 WA,而且没人知道为什么。
建题单
- 题库里准备好题。
- 「训练」→「创建训练」,填标题、简介、起止时间。
- 加章节,按顺序挂题。
- 设公开范围。
题单简介该写什么
不是复述标题。写三件事:
- 这个题单练什么(知识点清单)
- 前置是什么(没学过 X 的先别来)
- 大概要多久(让人能安排时间)
写得清楚,来的人做得下去;写得含糊,来的人做两道就跑了。
难度怎么标
按前置知识标,不按通过率标:
| 级别 | 判断标准 |
|---|---|
| 入门 | 会循环和数组就能做 |
| 普及 | 需要贪心、简单 DP、基础数据结构 |
| 提高 | 需要图论、树、较难 DP、数学推导 |
| 省选 | 需要建模,多个知识点组合 |
通过率受数据强弱影响很大,同一个题改个时限就能从 80% 掉到 20%。别用它当难度指标。
维护
- 题目改动后要重新验证已有提交是否还成立,否则排行榜失真。
- 长期不用的题单归档,不要删。删了历史提交记录一起消失,选手的进度就没了。
- 同一道题被反复申诉同一个点,说明题面有问题,去改题面,不要改数据糊过去。