1. 题目规范

2. 出题原则

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

以下有一些额外限制:

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

3. 时间 / 空间限制

  1. 请认真阅读 Sleeping Cup 评测须知 后再来看这一部分。
  2. std 应当在最坏情况下以不超过时间 / 空间限制的 50%50\% 通过题目。
  3. 当交互库等占用时间 / 空间时,设定时间 / 空间限制时允许先扣除对应时间 / 空间再进行考虑。
  4. 时间限制不得小于 0.10.1 秒,且必须为 0.10.1 秒的整数倍。
  5. 大于 11 秒的时间限制必须为 11 秒的整数倍,但不设上限。
  6. 空间限制必须在 88 MB - 10241024 MB 中取值,必须是整数 MB,且 MB 数必须是 22 的整数次幂。
  7. 如果卡空间不是题目难度的一部分,则空间限制必须设为 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, "");
}