为了避免出题人,可能是屏幕前的你,无意间让题目出锅,烦请过目下面的出题规范。

出题平台向

若使用 Polygon 进行出题,必须修复所有警告以提高题目的健壮性(毕竟你都决定用比较正式的出题平台了,为什么不贯彻到底)。

数据格式向

若不编写 Validator,请你对由 格式 / 范围 等错误造成的糟糕比赛体验负责。其中特别需要注意的是:

  1. 不要出现多余的空格,特别是每行的末尾
  2. 文件一定要以换行结束
  3. 不要出现制表符等特殊 ascii 字符。

上面是 Validator 中的最低要求,请不要因为 "能用 XX 方式读入" 就不考虑。

样例数据向

编者认为,样例的作用是 "让选手能更加透彻地理解题目,纠正一些可能的误区,提供格式参考",建议你:

  1. 在数据范围比较特殊的时候,提供特殊样例;
  2. 对于判定有无解的题,若非诈骗题,提供有解和无解的样例至少各一个;
  3. 给出至少一个样例解释,涉及图论之类的题至少给出一张图(可使用 Graph Editor 画图)。

题面格式向

此外,编者在此提供本人出题时约定的 latex 格式规范,可以让你的题面看起来比较规范舒适:

  1. 英文、中文、公式之间加上一个空格,遇到标点时不需要添加,如:这是一句话 Yes,对吗 666666 这个入。
  2. 所有数字和变量都用公式呈现,便于选手阅读,如 333.143.14aa
  3. 数据范围标注在输入格式对应的变量右侧,变量小写,如 第一行包含两个整数 n,mn, m (1n,m2×105)(1 \leq n, m \leq 2 \times 10 ^ 5),代表...
  4. 所有名词解释放在题面和输入格式中间,用 ^\dagger 等注解符进行标注和解释。
  5. 科学计数法用 ×10x\times 10 ^ x,变量间用 aba \cdot b

出题约定向

此外,下面提供 牛客竞赛出题规范 以供参考(摘自 QLUOJ,进行了部分补充):

  • 禁止在没有严格证明,并且没有使用暴力程序验证在数据范围内成立的情况下使用数学结论(经典数学结论/数学定理/公理不在此行列)。
  • 判断是否成立,输出 yes, no 的题目中不能要求选手输出 Ye5, n0 等。
  • 严格使用 testlib.h 编写 val,否则必须使用过其他方式验证数据合法(例如在 std 中使用 assert),但不建议使用 testlib 以外的方式校验数据。见:https://oi-wiki.org/tools/testlib/
  • 禁止测试数据对 std 友好,必须包含将 std 卡到最大复杂度的测试数据。
  • 输入、输出描述应该仅包含输入输出格式,数据范围,禁止仅在此处填写解题的关键条件。
  • 输入输出描述必须包含变量、变量的数据范围、变量的输入输出格式,变量的含义,且使用 LaTeX 公式描述LaTeX规范:https://oi.wiki/tools/latex/
  • 树上题目 / 图论题目,若题目未特殊声明,后台数据禁止完全随机,必须保证暴力算法和搜索不能通过。
  • 如与解题的核心算法考点 / 题目难度无关,当出现多解时必须编写 spj。
  • 图论问题必须显式的说明是单向边还是双向边,在输入描述中必须指出测试数据中是否包含自环、重边等信息。
  • 树上问题如果是有根树,必须显式的指出根节点或输入根节点,不能让选手通过输入的方式自己推导根节点。
  • 禁止出现虚假数据范围,当无其他条件导致题目数据无法达到最大时,必须保证后台测试数据包含对于每个变量均达到最大值/最小值的数据。
  • 输出为实数的题目应使用 spj,并且保证分别使用 long double 和 double 的情况下,绝对和相对误差的最小值不超过 0.5 * EPS。
  • 禁止以 "某道题目是难题" 为由,将时间空间卡的特别死,仅让使用 c/c++ 的选手通过。
  • 禁止题目要求读取数据直到文件结尾 EOF,应使用 tt 表示测试用例的组数。
  • 禁止限制选手是否输出行末空格,以及文件末的回车。必须保证无论选手是否输出行末空格,以及文件末的回车都能通过题目。
  • 字符画题目禁止出现前导 / 后置空格。
  • 字符画题目禁止出现空格以外的空白字符。
  • 若要求选手输入包含空白字符的字符串,必须在输入描述醒目位置提醒 "输入一个包含空白字符的字符串"。
  • 若要求选手输入字符串时包括空白字符整行读取,则必须给出该字符串的长度,例如:输入一个数字 nn 表示字符串长度,接下来一行输入一个包含空白字符的字符串...。
  • c++ std 禁止使用火车头。
  • c++ std 禁止使用内联汇编 / 与平台相关的指令集优化。
  • c++ std 禁止使用读入优化 / 非必要情况下的数组复用。
  • std 标准程序使用的时间 / 空间限制,在不存在近似复杂度的非预期解法下不得超过时间 / 空间限制的 50%,但任何条件下均严禁超过 80%。
  • 对于区分 easy, hard version 的题目,应在醒目位置(一般是题目开头位置)注明与另一个版本的差异。
  • 题目中禁止不加千分符或者科学计数法的情况下出现重复数位较多的数字,且该数字有明显误导性,例如 100000007100000007,应改为 108+710^8+7 或者 100'000'007。
  • 题目中空间限制不得低于 64MB,否则可能会导致 java 等语言无法通过。
  • 如与题目解题方式 / 题目难度无关,计算几何题目中输入点坐标时,使用整点而非浮点数。
  • 输入的变量数目禁止达到 10710^{7} 及以上,当出现这种情况时,通过在题目中给出(随机)数据生成器的伪代码,或混合输入方式,例如输入 10510^5 个变量,后序使用题目中提供生成器的方式。
  • 输出的变量数目禁止达到 10710^7 及以上,当出现这种情况时,要求输出异或和、或者求和取余的方式。
  • 强制在线题目必须在样例解释 / 备注中添加加密前的数据。
  • 要求输出 nn 个答案的异或和等场景时,必须在样例解释中提供部分有意义的信息。
  • 禁止在题目中要求选手使用 std::random 或 mt19937 等库函数代替输入。必须在题目中提供随机数生成器。
  • 要求选手输出取模 / 取余的答案时,若原本的答案存在负数,则慎重考虑使用 "取模" 还是 "取余"。必须给出原本答案是负数的例子或在题目描述中进行强调。
  • 禁止对除数为负数的变量使用 "取模" 的概念,例如 "模 -5"。
  • NP 问题带有剪枝的 std,必须证明至少一个上界(无需保证上确界)满足最大范围数据的复杂度需求。
  • 题目输入 / 输出中只能包含 ASCII 字符,禁止出现中文和 unicode 字符。
  • 在题目中提供数据生成器、强制在线的加解密算法必须真实有效,不得有误导或者任何欺骗行为。
  • 当题目需要输入字符串时,必须在输入描述中显式的指明字符串的字符集。
  • 当题目描述中涉及到 "集合" 的概念时,需注意是否为 "可重集"。当涉及到 "子集" 概念时,需注意是否为 "真子集",且是否包含 "空集"。需在题目描述中显式给出,或不在题目描述中说明,但有样例支持且在样例解释中给出。
  • 当题目涉及到 子串 / 子区间 / 子序列 / 前缀 / 后缀 等概念时,必须显式的注明:① 是否包含自身; ② 是否可以为空,或在样例中有所体现。
  • 当涉及到有多少种不同的 XX 满足条件的描述时,需对 "不同" 做相应的解释。若题目首先需要选手进行某些 "操作",再求不同的 "值" 时,使用 "本质不同" 强调其值上的差别而非操作上的差异。例如:求本质不同的子序列 / 子串个数。
  • 中文描述的题目中,使用 "连续子区间 / 子段" 代替 "连续子序列"。
  • 对于逻辑上判断 yes, no 的题目,应使用 spj 忽略大小写(在勾选 spj 时使用 "nyesno" 预设 testlib spj)。且在输出描述中提醒:“你可以输出任意大小写的 "Yes" 或者 "No"。
  • 在不暴露核心算法的前提下,博弈类题目需提供至少 11 组先手胜利,11 组后手胜利的样例输入 / 输出。
  • 在不暴露核心算法 / 坑点的前提下,对于输出格式中的任何分支都要满足,例如 "无解输出 1-1,否则 xxx",除非任何无解样例都会暴露核心算法 / 坑点,否则样例中必须包含无解。
  • 禁止与题目完全无关的大段背景描述(超过 300300 字)。
  • 出题人应保证除 c/c++ 以外,python 和 java 的其中一种可以通过题目。
  • 如果输入变量的个数多余 5×1055 \times 10^5,则必须在题目描述醒目位置提醒其数据范围,建议选手使用快速的输入方式。

写在最后向

出题和做题是双向的,请在出任何可能造成不佳体验的题之前,将自己代入选手的视角慎重考虑。

希望你的题,能被选手认可,能达到你的预期。

0 条评论

目前还没有评论...