如何在 Codeforces 上出題?

前言

最近因爲一些出題的任務,瞭解了從 Polygon 出題 \rightarrow Codeforces 上添加題目 \rightarrow Vjudge 上掛題的完整流程,因此也在此做一個記錄與分享。

流程概述

整個流程可以分爲下述各部分內容。

  • Polygon 出題
    • 題面
    • 標程
    • 選擇 checkerchecker
    • 上傳數據生成器
    • 用腳本生成數據
    • commitcommit
    • packagepackage
  • Codeforces 上添加題目
    • 創建 mashupmashup
    • 添加 Polygon 題目鏈接
    • 設置 mashupmashup 邀請的用戶
  • Vjudge 上掛題
    • 創建 Vjudge 比賽
    • Vjudge 比賽中添加題目

Polygon 出題

註冊、創建

Polygon 網址

進入網址後,先註冊登陸,然後點擊 New Problem 開始創建一個題目表格,注意此處的 Name 只是項目名,不是最終的題目名。
在這裏插入圖片描述

題面

創建完成後,可以點擊 My problems 進入題目編輯界面如下。接下來可以在 General info 頁面編輯時空限制以及 input、output 信息。
在這裏插入圖片描述
之後進入 Statement 編輯題面。

此處需要注意以下幾點:

  1. 題面編輯支持 LatexLatex
  2. 題面編輯內容不包括樣例,樣例在 TestsTests 中生成
  3. 題面編輯完後需要 Save

在這裏插入圖片描述

Checker 與 標程

Checker 頁面可以選擇現有的 CheckerChecker 也可以添加自己定義的內容。
在這裏插入圖片描述
選擇完 CheckerChecker 後,在 Solution_files 頁面添加標程。
在這裏插入圖片描述

上傳數據生成器

Files 頁面添加數據生成器的代碼。可以注意到此處的 ResourceFilesResource Files 中提供了 testlib.htestlib.h 文件,因此我們可以根據該文件編寫數據生成器。

我們可以在 githubgithub 上找到該項目。將項目 cloneclone 下來後,添加自己的 generator.cppgenerator.cpp 用於數據構造。

具體的代碼使用例子可以在 githubgithub 上找到,此處給出一個簡單示例。此處需要注意下述代碼是根據命令行參數來進行隨機的,因此如果命令行參數相同,生成的數據也將保持不變。

#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 加入標程,即可看到標程運行數據點的情況。(此處的 OKOK 僅表示標程符合時空限制)

在這裏插入圖片描述

Commit、Package

完成題面、標程、數據後,即可 Commit Changes,即將當前的修改提交,類似於 githubgithub 的版本管理。
在這裏插入圖片描述
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 中還有更多高效好用的操作等待大家去挖掘,去進一步提高出題效率!感興趣的朋友可以繼續研究!

最後祝大家出題愉快,AA 題愉快,在程序設計的成長道路上更進一步!💪💪💪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章