西北大学2019春季校赛填坑笔记

大家好,我是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.Word

 

 

好就在大家都会用,上手难度低,可玩性也高,

我参考牛客网的排版,做了两次校赛的题面,觉得很好看

主要规则如下:
1.风格统一,一页之内不要出现3种以上的字体
2.页边距收窄,紧凑一些,样例尽量用双栏,尽量一页一题
3.所有字母/数字推荐用Cambria Math斜字体,样例请务必用等宽字体

4.汉字推荐宋体/华文中宋,标题推荐微软雅黑
5.首页放上封面,不让选手提前看题
6.记得在封面上写一些注意事项
7.公式就老老实实按alt和'+'创建标准公式
8.善用边框线功能,格式刷功能,公式功能

     

最后,为了跨版本/跨平台/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://www.codecogs.com/latex/eqneditor.php 2.画图

在线画图平台,有几何,函数等:https://www.geogebra.org/
类似的还有:https://www.desmos.com


4.评测平台和滚榜
这个部分较为复杂,我就简单的写一下,可以自行摸索
截止到2018年春季校赛,我们使用的都是pc2,
到了2018冬季新生赛的时候,就全面改用了各方面都更优异的domjudge
网址如下:
官方网站:https://www.domjudge.org/
参考博客:
https://blog.csdn.net/AASE1235779/article/details/84110193
https://www.cnblogs.com/mcginn/p/8976797.html
https://weidongxu84.wordpress.com/2012/07/21/domjudge%E7%BB%93%E6%9E%84%E7%AE%80%E4%BB%8B/
https://blog.csdn.net/u014451076/article/details/50818578
至于滚榜,在多次测试之后,我们使用了github上的这个项目:
https://github.com/hex539/scoreboard
至于服务器,这个就各显神通了,包括按小时租借的云服务器,或者是自家学校网络中心的都可以
最近两次比赛,我们都用了我们自己学校的服务器

5.重现赛/同步赛
 可以做同步赛/重现赛的有牛客,质心,计蒜客等,有时候可以获得一些奖品赞助
  2018年冬季的新生赛我们在牛客网放了同步赛,效果很好,还给了很多礼物,非常感谢
  https://ac.nowcoder.com/acm/contest/321#question
  2019年春季的组队模拟赛,我们在质心教育的cometoj做了重现赛,他们也提供了礼物,同样非常感谢
  https://www.cometoj.com/contests

其他的,就主要是正式比赛的后勤了,其实这里写的比较清楚:

   


这应该是我完整接手的最后一次校赛了,也希望大家以后都能办好校赛

(不得不感叹这场比赛真的压力大,出题组+验题组一共只有3人,技术组也只有1个人,幸亏domjudge不需要手点评测..)

比赛主要出题人/验题人:JWJ,NE,DQS

技术支持:CJC7373

题面制作:JWJ,NE

感谢其他现役队员和志愿者的帮忙

posted @ 2019-03-18 03:48  nervending  阅读(858)  评论(0编辑  收藏  举报