如何在 Codeforces 上出题?

前言

最近因为一些出题的任务,了解了从 Polygon 出题 → \rightarrow Codeforces 上添加题目 → \rightarrow Vjudge 上挂题的完整流程,因此也在此做一个记录与分享。

流程概述

整个流程可以分为下述各部分内容。

  • Polygon 出题
    • 题面
    • 标程
    • 选择 c h e c k e r checker checker
    • 上传数据生成器
    • 用脚本生成数据
    • c o m m i t commit commit
    • p a c k a g e package package
  • Codeforces 上添加题目
    • 创建 m a s h u p mashup mashup
    • 添加 Polygon 题目链接
    • 设置 m a s h u p mashup mashup 邀请的用户
  • Vjudge 上挂题
    • 创建 Vjudge 比赛
    • Vjudge 比赛中添加题目

Polygon 出题

注册、创建

Polygon 网址

进入网址后,先注册登陆,然后点击 New Problem 开始创建一个题目表格,注意此处的 Name 只是项目名,不是最终的题目名。
在这里插入图片描述

题面

创建完成后,可以点击 My problems 进入题目编辑界面如下。接下来可以在 General info 页面编辑时空限制以及 input、output 信息。
在这里插入图片描述
之后进入 Statement 编辑题面。

此处需要注意以下几点:

  1. 题面编辑支持 L a t e x Latex Latex
  2. 题面编辑内容不包括样例,样例在 T e s t s Tests Tests 中生成
  3. 题面编辑完后需要 Save

在这里插入图片描述

Checker 与 标程

Checker 页面可以选择现有的 C h e c k e r Checker Checker 也可以添加自己定义的内容。
在这里插入图片描述
选择完 C h e c k e r Checker Checker 后,在 Solution_files 页面添加标程。
在这里插入图片描述

上传数据生成器

Files 页面添加数据生成器的代码。可以注意到此处的 R e s o u r c e F i l e s Resource Files ResourceFiles 中提供了 t e s t l i b . h testlib.h testlib.h 文件,因此我们可以根据该文件编写数据生成器。

我们可以在 g i t h u b github github 上找到该项目。将项目 c l o n e clone clone 下来后,添加自己的 g e n e r a t o r . c p p generator.cpp generator.cpp 用于数据构造。

具体的代码使用例子可以在 g i t h u b github github 上找到,此处给出一个简单示例。此处需要注意下述代码是根据命令行参数来进行随机的,因此如果命令行参数相同,生成的数据也将保持不变。

#include "testlib.h"
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
    registerGen(argc, argv, 1); /* 根据命令行参数来进行数据生成 */
    cout << (int)rnd.next(1, 10) << endl; /* [0,1] 内的整数 */
    cout << rnd.next(1, 10) << endl; /* [0,1] 内的浮点数字 */
    cout << rnd.next("[a-zA-Z0-9]{1,1000}") << endl;  /* 符合[a-zA-Z0-9] 特点的长度在1~1000之内的字符串 */
}

在这里插入图片描述

用脚本调用数据生成器生成数据

Tests 页面编写下述脚本,点击 Save Script 来运行脚本。
在这里插入图片描述
运行脚本后即可得到下述的各个数据,其中点击每个测试点的 Example 可以将测试点设置为样例,即展示在题面中。
在这里插入图片描述

用标程跑一遍数据,测试时空限制

点击 Invocations 加入标程,即可看到标程运行数据点的情况。(此处的 O K OK OK 仅表示标程符合时空限制)

在这里插入图片描述

Commit、Package

完成题面、标程、数据后,即可 Commit Changes,即将当前的修改提交,类似于 g i t h u b github github 的版本管理。
在这里插入图片描述
Commit Changes 后,进入 Packages 界面,点击 Standard 即可进行打包。打包成功后,基本的题目就算创建完成了。
在这里插入图片描述目前为止,基本的题面创建就算完成了。当然,Polygon 的功能远不仅于此,更多的功能可以在该网页中了解。

最后需要注意,该题目的标识符由右下角的网址来决定,之后的 Codeforces 挂题也将使用该链接进行挂题。

在这里插入图片描述

Codeforces 上组建题目

创建 MASHUP

GymMASHUPS 页面创建一个新的 mashup
在这里插入图片描述
在这里插入图片描述

添加题目

进入刚创建的 mashup 页面,添加题目,此处的网址即为刚才 Polygon 创建完题目后生成的链接。
在这里插入图片描述

邀请其他成员

由于 mashup 在设置中是 private 的,因此我们只有对其他账号赋予权限才可以使他们能够访问你的 mashup
在这里插入图片描述
Invited users 中添加用户,用户即可拥有访问题目的权限。注意此处需要将 vjudge 添加进去,之后才可以在 vjudge 中检测到 mashup 中的题目。
在这里插入图片描述

Vjudge 上挂题

创建比赛

Contest 页面中创建新比赛。
在这里插入图片描述

在比赛中加入题目

此处的 OJ 选择 GymProbNum 可以从 mashup 的网址找到,即对于 codeforces.com/gym/123456123456 即为 Gym 编号。最后再添加题目编号,如 A、B、C、D,即可检索到该题(Vjudge 有的时候会检索出错,未检索到则重试)。
在这里插入图片描述

后记

至此,Codeforces 出题的基本过程就结束了。当然在 Polygon 中还有更多高效好用的操作等待大家去挖掘,去进一步提高出题效率!感兴趣的朋友可以继续研究!

最后祝大家出题愉快, A A A 题愉快,在程序设计的成长道路上更进一步!💪💪💪

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gene_INNOCENT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值