西北大学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.善用边框线功能,格式刷功能,公式功能
      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.评测平台和滚榜
      这个部分较为复杂,我就简单的写一下,可以自行摸索
      截止到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

其他的,其实这里写的比较清楚了:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



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

 


 


 

 

比赛主要出题人/验题人:jwj,NE,dqs

 

技术支持:cjc7373

题面制作:jwj,NE

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

转载于:https://www.cnblogs.com/nervendnig/p/10549906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值