大家好,我是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#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 pythonfrom 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 osfor 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.php2.画图
画图用了这个免费的在线画图平台,有几何,函数等:https://www.geogebra.org/
类似的还有:https://www.desmos.com4.评测平台和滚榜
5.重现赛/同步赛
这应该是我完整接手的最后一次校赛了,也希望大家以后都能办好校赛.
比赛主要出题人/验题人:jwj,NE,dqs
技术支持:cjc7373
题面制作:jwj,NE
感谢其他现役队员和志愿者的帮忙