大家好,我是NE,
2019春季校赛终于办完了,这里零零散散的写一写东西吧
记录一下遇见的问题和我的简单解决方法,作为后面人的参考
目录:
- 协同工作
- 出题
- 题面制作
- 评测平台滚榜
- 重现赛/同步赛
- 其他
1.协同工作
一个人很难出一套题,然后再自己验题,因此需要协同工作
1.建议使用云文档,进行协同办公,方便又清晰,可以随时总览整个题表,分析难度,出题进度等
2.建立一个群,实时讨论,保存和备份文件
3.搭建一个临时的oj,方便验题,花式测试,甚至懒的话用来可以代替本地std和暴力的测试
4.具体地,我们用的是Tim+腾讯云文档+青岛大学开源OJ
2.出题
我们出题的过程大概是
1.确定题表
思考难易度,涉及的算法,是否防AK,是否防爆零等,然后把憋了很久的脑洞堆起来,最后确定整个初步题表,此时没有数据,题面,std,只有思路
2.生成数据
初步写好精简的题面,确定数据范围和已有的思路,对着去尝试写std,暴力,数据生成器
这里就会遇见很多事情了
输入输出数据生成我自己用了2种方案,c++或者python:
1.C++数据生成器
假设你已经写好了整个std/暴力,那么很简单,把main和涉及到的所有变量,装进一个namespace里,然后贴过去就行了
亲测能胜任各种简单题的数据生成
模板如下,每组数据记得要对std和暴力进行初始化:
#include <bits/stdc++.h>
#define rep(ii,a,b) for(int ii=a;ii<=b;++ii)
using namespace std;
namespace gen{//输入生成器
int main() {}
};
namespace stdd{//答案生成器-std
int main() {}
};
namespace bf{//答案生成器-暴力
int main() {}
};
int main() {
char _in[100],_out[100];
rep(xx,1,10) {//会在同目录下自动生成文件,名为xx.in和xx.out
sprintf(_in,"%d.in",xx);sprintf(_out,"%d.out",xx);
/****************生成输入,会自动删掉原来的,只要重造输出数据的话,注释这个部分即可******/
freopen(_in,"w",stdout);
gen::main();
fclose(stdout);
/****************生成STD输出,会覆盖原来的输出*********************************/
freopen(_in,"r",stdin);freopen(_out,"w",stdout);
stdd::main();
fclose(stdin);fclose(stdout);
/****************生成暴力输出,会覆盖原来的输出*****************************/
// freopen(_in,"r",stdin);freopen(_out,"w",stdout);
// bf::main();
// fclose(stdin);fclose(stdout);
/*****************************************************/
system(_in);system(_out);//打开数据
}
return 0;
}
此外,github上有另外一个C++制造数据的项目 https://github.com/WalterBrightHub/ACMDataMaker
但我觉得并不好用,仅作为参考.
2.Python数据生成器
主要是因为有些数据不太好出,比如图论,几何,我选择用脚本语言python+github上的项目,
本次校赛中,我用了洛谷的cyaron https://github.com/luogu-dev/cyaron 这个项目是基于python的,
不会python也没关系,装一个python 3的环境,打开vscode去写代码,30分钟就能入门写脚本,不比简单入门latex难多少
我自己用的是vscode写代码,然后在cmd上运行
我自己主要是生成了2个图论数据,它的功能还有很多,可以自行摸索
可以生成各种数据,非常好用
需要注意的是,如果你的std锅了,python会报错在std被运行的那一行
我的一个生成器脚本如下:
#!/usr/bin/env python
from cyaron import *
for i in range(3, 4):
test_data = IO(file_prefix="", data_id=i)
n = 200000
m = 200000
test_data.input_writeln(n, m)
val = []
a = []
b = []
for j in range(0, n):
val.append(randint(2 ** 19-1,1000000))
test_data.input_writeln(val)
graph = Graph.chain(n)
test_data.input_writeln(graph.to_str(output=Edge.unweighted_edge))
for j in range(0, m):
if(j%10<=5):
a = 1
b = randint(1,n)
test_data.input_writeln(a, b)
elif(j%10 <=8):
a = 2
b = randint(1, n)
c = 2 ** 19-1
test_data.input_writeln(a, b, c)
else:
a = 3
b = randint(1,10)
test_data.input_writeln(a, b)
test_data.output_gen("std.exe")#把标程exe放在同目录即可
3.零零散散的其他博客/项目:
https://blog.csdn.net/u013598409/article/details/49967969
https://github.com/Deyi-Wang/OI-ACM-testcases-creater
https://blog.csdn.net/WADuan2/article/details/78445955
https://blog.csdn.net/darost/article/details/72550943
4.其他
有时候,dfs题目的std在本地生成标准答案时会爆栈,导致只能生成1e5以下的答案数据
此时需要加入内嵌的汇编指令扩栈,放在main下面一行就行
int size = 256 << 20;//256MB
char*p=(char*)malloc(size) + size;
__asm__("movl %0, %%esp\n" :: "r"(p) )
如果要使用domjudge,需要文件名批量修改,用bat即可,放在同目录下就行
ren *.out *.ans
3.对拍与验题
写完std后,需要验证其准确性,此时使用暴力进行小范围对拍就行
出完数据后,也需要验题
具体方式有多种,我用过本地测试和OJ测试
本地一般用于对拍暴力和std,初步验证算法是否正确
1.使用fc指令
具体不多说,py代码如下,放在同目录下运行就行,当然,C++应该也是可以的
import os
for i in range(1, 100):
stdin = "data" + str(i) + ".in"
stdout = "stdout" + str(i) + ".out"
bfout = "data" + str(i) + ".out"
os.system("fc "+stdout+" "+bfout)
2.使用OJ
首先,你要有一个服务器,那么青岛大学的一键式OJ极其好用,把数据上传上去,然后进行提交测试即可
https://github.com/QingdaoU/OnlineJudgeDeploy/tree/2.0
3.使用OI工具箱
这个可能会比较好用,但上面的已经够用了,想用可以自行摸索
说明:https://abc233.site/archives/47 下载:https://oitoolbox.github.io/
3.题面制作
好就在大家都会用,上手难度低,可玩性也高,我参考牛客网的排版,做了两次校赛的题面,
我觉得很好看,主要规则如下:
1.风格统一,一页之内不要出现3种以上的字体
2.页边距收窄,紧凑一些,样例尽量用双栏,尽量一页一题
3.所有字母/数字推荐用Cambria Math斜字体,样例请务必用等宽字体
4.汉字推荐宋体/华文中宋,标题推荐微软雅黑
5.首页放上封面,不让选手提前看题
6.记得在封面上写一些注意事项
7.公式就老老实实按alt和'+'创建标准公式
8.善用边框线功能,格式刷功能,公式功能
9.为了跨版本/跨平台/word换wps不出锅,请另存为pdf进行打印和最终发布
2.公式和$LATEX$
由于出题组不是人人都会$LATEX$,为了方便每个人都能随时修改题面,
最后采用了大家都会的Word
有兴趣可以自行摸索$LATEX$,毕竟写博客/做公式/写论文还是要用$LATEX$的
文档1:https://wenku.baidu.com/view/c70982ed51e79b89680226f6.html?from=search
文档2:http://www.mohu.org/info/lshort-cn.pdf
速查手册:http://www.mohu.org/info/symbols/symbols.htm
公式实时生成/测试:https://private.codecogs.com/latex/eqneditor.php
2.画图
画图用了这个免费的在线画图平台,有几何,函数等:https://www.geogebra.org/
类似的还有:https://www.desmos.com
4.评测平台和滚榜
5.重现赛/同步赛
这应该是我完整接手的最后一次校赛了,也希望大家以后都能办好校赛.
比赛主要出题人/验题人:jwj,NE,dqs
技术支持:cjc7373
题面制作:jwj,NE
感谢其他现役队员和志愿者的帮忙