前言
最近因爲一些出題的任務,瞭解了從 Polygon 出題 Codeforces 上添加題目 Vjudge 上掛題的完整流程,因此也在此做一個記錄與分享。
流程概述
整個流程可以分爲下述各部分內容。
- Polygon 出題
- 題面
- 標程
- 選擇
- 上傳數據生成器
- 用腳本生成數據
- Codeforces 上添加題目
- 創建
- 添加 Polygon 題目鏈接
- 設置 邀請的用戶
- Vjudge 上掛題
- 創建 Vjudge 比賽
- Vjudge 比賽中添加題目
Polygon 出題
註冊、創建
進入網址後,先註冊登陸,然後點擊 New Problem
開始創建一個題目表格,注意此處的 Name
只是項目名,不是最終的題目名。
題面
創建完成後,可以點擊 My problems
進入題目編輯界面如下。接下來可以在 General info
頁面編輯時空限制以及 input、output
信息。
之後進入 Statement
編輯題面。
此處需要注意以下幾點:
- 題面編輯支持
- 題面編輯內容不包括樣例,樣例在 中生成
- 題面編輯完後需要
Save
Checker 與 標程
在 Checker
頁面可以選擇現有的 也可以添加自己定義的內容。
選擇完 後,在 Solution_files
頁面添加標程。
上傳數據生成器
在 Files
頁面添加數據生成器的代碼。可以注意到此處的 中提供了 文件,因此我們可以根據該文件編寫數據生成器。
我們可以在 上找到該項目。將項目 下來後,添加自己的 用於數據構造。
具體的代碼使用例子可以在 上找到,此處給出一個簡單示例。此處需要注意下述代碼是根據命令行參數來進行隨機的,因此如果命令行參數相同,生成的數據也將保持不變。
#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
加入標程,即可看到標程運行數據點的情況。(此處的 僅表示標程符合時空限制)
Commit、Package
完成題面、標程、數據後,即可 Commit Changes
,即將當前的修改提交,類似於 的版本管理。
Commit Changes
後,進入 Packages
界面,點擊 Standard
即可進行打包。打包成功後,基本的題目就算創建完成了。
目前爲止,基本的題面創建就算完成了。當然,Polygon 的功能遠不僅於此,更多的功能可以在該網頁中瞭解。
最後需要注意,該題目的標識符由右下角的網址來決定,之後的 Codeforces
掛題也將使用該鏈接進行掛題。
Codeforces 上組建題目
創建 MASHUP
在 Gym
的 MASHUPS
頁面創建一個新的 mashup
。
添加題目
進入剛創建的 mashup
頁面,添加題目,此處的網址即爲剛纔 Polygon
創建完題目後生成的鏈接。
邀請其他成員
由於 mashup
在設置中是 private
的,因此我們只有對其他賬號賦予權限纔可以使他們能夠訪問你的 mashup
。
在 Invited users
中添加用戶,用戶即可擁有訪問題目的權限。注意此處需要將 vjudge
添加進去,之後纔可以在 vjudge
中檢測到 mashup
中的題目。
Vjudge 上掛題
創建比賽
在 Contest
頁面中創建新比賽。
在比賽中加入題目
此處的 OJ
選擇 Gym
,ProbNum
可以從 mashup
的網址找到,即對於 codeforces.com/gym/123456
,123456
即爲 Gym
編號。最後再添加題目編號,如 A、B、C、D,即可檢索到該題(Vjudge
有的時候會檢索出錯,未檢索到則重試)。
後記
至此,Codeforces
出題的基本過程就結束了。當然在 Polygon
中還有更多高效好用的操作等待大家去挖掘,去進一步提高出題效率!感興趣的朋友可以繼續研究!
最後祝大家出題愉快, 題愉快,在程序設計的成長道路上更進一步!💪💪💪