1. 题目文本

2. 出题原则

以上链接中所有规则均需遵守,例外:003,020,021,022,030,034,038,041。

以下有一些额外限制:

  1. 数据文件需要依次命名为 1.in/out2.in/out,以此类推。
  2. 数据生成器的名称必须包含 gen 字段。
  3. 允许没有部分分,但不允许过于不合理的部分分。
  4. 遵守本文给出的其他规范。
  5. 遵守第一节链接中给出的其他规范。
  6. (可选)尽量和 历届试题 保持风格一致。

3. 时间 / 空间限制

  1. std 应当在最坏情况下以不超过时间 / 空间限制的 50%50\% 通过题目。
  2. 当时间限制大于 11 秒时,对 std 的时间要求放宽 0.10.1 秒。
  3. 当时间限制小于 3232 MB 时,对 std 的时间要求放宽 33 MB。
  4. 时间限制不得小于 0.10.1 秒,且必须为 0.10.1 秒的整数倍。
  5. 大于 11 秒的时间限制必须为 11 秒的整数倍,但不设上限。
  6. 空间限制必须在 88 MB - 10241024 MB 中取值,必须是整数 MB,且 MB 数必须是 22 的整数次幂。
  7. 空间限制为 10241024 MB 的题目不保证能够正常评测。
  8. 如果卡空间不是题目难度的一部分,则空间限制必须设为 512512 MB。

4. 数据文件

上传的数据中必须包含:

  • 所有输入输出数据文件。
  • config.yaml,题目配置文件。
  • std.cpp,标准程序。
  • 所有数据生成器。
  • (如果有)checker、交互库等额外文件。
  • (对于提交答案题)所有标准答案。

5. 题解

题解应当简要描述题目做法,可以比较简略,但对于难以理解的题目必须给出足够解释。

题解中必须包含标准答案或标准程序代码。

6. 主观题

主观题中存在以下额外要求:

  1. 除题目描述和答案示例外与 已有的主观题 保持一致。
  2. 对于存在部分分的主观题,处理方式参考 #2 E
  3. 对于存在子问题的主观题,处理方式参考 #3 D
  4. 对于无部分分的普通主观题,处理方式参考 #1 D
  5. 题目描述中必须将需要选手作答的问题部分全文加粗。
  6. 参考答案必须和答案示例保持格式一致,且部分分基准点必须加粗 + 高亮标出。
  7. 测试数据内应当恰好包含以下文件。
# 文件名:config.yaml
# 这三行是注释,可以删去。
# 除此之外,请务必原样粘贴以下代码!
type: default
memory: 512MB
filename: proof
checker_type: testlib
checker: checker.cpp
subtasks:
  - score: 100
    if: []
    id: 1
    type: sum
    cases:
      - input: /dev/null
        output: /dev/null
// 文件名:checker.cpp
// 以下程序适用于没有部分分的主观题。
// 同样的,除了注释以外,什么都不要动!
#include <bits/stdc++.h>
#include "testlib.h"
using namespace std;
const int answers[] = {1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6, 0};
// answers 数组记录了通过本题的选手名单,例如:
// 1 代表 UID = 1 的选手赛时通过了此题。
// -2 代表 UID = 2 的选手赛后通过了此题。
// 0 是结束标志。
// 当有选手通过本题时,
// 请更新 answers 数组,
// 并向管理组申请更新评测状态。
int main(int argc, char** argv)
{
    registerTestlibCmd(argc, argv);
    int ID = ouf.readInt();
    int pos = 0;
    while (answers[pos])
    {
        if (answers[pos] == ID) quitf(_ok, "");
        pos++;
    }
    quitf(_wa, "");
}
// 文件名:checker.cpp
// 以下程序适用于有部分分的主观题。
// 同样的,除了注释以外,什么都不要动!
#include <bits/stdc++.h>
#include "testlib.h"
using namespace std;
const int answers[] = {1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6, 0};
const double scores[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
// answers 数组记录了在本题得分的选手名单,例如:
// 1 代表 UID = 1 的选手赛时在此题得分。
// -2 代表 UID = 2 的选手赛后在此题得分。
// 0 是结束标志。
// scores 数组记录了对应选手的得分,例如:
// 0.2 代表得了 20 分,
// 1 代表得了 100 分(满分)。
// answers 数组中记录的每个选手对应相同下标的 scores 参数,
// 例如 answers[3] 对应 scores[3]。
// 当有选手在本题得到新的个人得分记录时,
// 请更新 answers 数组和 scores 数据,
// 并向管理组申请更新评测状态。
int main(int argc, char** argv)
{
    registerTestlibCmd(argc, argv);
    int ID = ouf.readInt();
    int pos = 0;
    while (answers[pos])
    {
        if (answers[pos] == ID) quitf(_ok, "");
        pos++;
    }
    quitf(_wa, "");
}