(PTA)OMS + ICPC Tools (CCPC 2025 Women’s Division)
先给个补题链接:第十一届中国大学生程序设计竞赛 女生专场(CCPC 2025 Women’s Division)
写在开头
本次2025年CCPC国赛的女生专场在我们成都信息工程大学成功举办,我个人很高兴被委任为这次学生这边的技术负责人(当然也感谢另外两位一起工作的学长:某野生逗比、YFffffff;同时感谢 vcpf 全程协助调试,另外感谢学校和DSA实验室的老师给了我这样的机会)。比赛前一周我们技术核心三人组也是花费了很大的精力来配置这次比赛所以需要的各种环境(包括选手用机的安装,CDS等相关服务的配置),也算是我第一次在如此重要的场合来尝试我之前看到的一些技术吧。

(图为没关计划任务的某些功能和传递优化导致凌晨2:00在网吧监控比赛机的技术组四人)
比赛用机的配置
本次比赛我们配置的系统和IDE如下:
系统:Windows 11 Enterprise LTSC 2024
软件列表:
IntelliJ IDEA Community Edition 2025.2.3(我们后面换了Ultimate版,但是赛时可能导致授权问题,这边建议还是社区版)
Eclipse 4.27 (2023-03)
PyCharm (统一产品) 2025.2.3
CLion 2025.2.3(需提前向 JetBrains 申请本地激活码激活,否则会出现类似 Ultimate 版的授权问题)
VS Code 1.105.1 (C、C++、Python、Java、Code Runner、CPH)
RedPandaIDE 3.2.2958(其中设置了PTA允许的C、C++的STD版本)
Codeblocks 25.03
OMS 2.1.3
编译环境:
MingGW-GCC: 11.4.0(用小熊猫自带的就好了,手动配环境变量指向这里,方便其它IDE调用这个编译器)
Bellsoft openjdk: 17.0.13
Python: 3.10.13
Clang: 17.0.6(配置好环境变量后在小熊猫C++刷新编译器就看到了,但是我们用的这个不能使用bits/stdc++.h头)
PyPy3: 3.10.14
比赛后台用机的配置
系统:Windows 11 Enterprise LTSC 2024
环境:Bellsoft-openjdk 21
配置选手用机母盘
- 
OMS 开机自启配置 我们这里采用的方案是使用Windows自带的任务计划程序(在开始菜单搜索就能看到)来判断用户登录的时候启动OMS(通过该方式可便捷启动 OMS 并以管理员权限运行,且不会弹窗申请管理员权限)。 但特别注意以下: - 
一定在配置的时候勾选以最高权限运行。 
- 
一定要勾选掉“如果任务运行时间超过以下时间,停止任务”。 
- 
一定要勾选掉“如果请求后任务还在运行,强行将其停止” (因未取消后两项勾选,我们花费近两天时间排查问题,甚至还和PTA那边找了半天问题(bushi))。 
 
- 
具体配置如图:





配置完成后重启计算机应该就能看见OMS自启了。
- 
去除掉JetBrains IDE的AI和内联补全功能 不想去除的可以用下面的版本: 删除以下目录的插件后,在 IDE 中禁用对应功能即可。 我们这次的参考如下: - 
Restrict or disable Assistant features | AI Assistant Documentation  通过文档,该功能依赖API接口,OMS 启动后会禁用网络,因此比赛中途无法使用该功能。 
- 
Full Line 代码补全 | IntelliJ IDEA 文档 通过文档,该功能依赖于 Full Line Code Completion 插件,该插件默认在 IntelliJ IDEA 2025.2.3、PyCharm 2025.2.3、CLion 2025.2.3中捆绑并启用。  该插件默认捆绑在各IDE的安装目录中,参考如下: 该插件默认捆绑在各IDE的安装目录中,参考如下:1 2 3C:\JetBrains\IntelliJ IDEA 2025.2.3\plugins\fullLine C:\JetBrains\CLion 2025.2.3\plugins\fullLine C:\JetBrains\PyCharm 2025.2.3\plugins\fullLine在删除这些文件后,Full Line 代码补全(内联补全)功能失效,如果需要还原该功能,需要重新安装软件(即需要从网络或者外置设备中重新下载或者加载安装包安装,这种行为会被OMS阻止)。 去除后,需要手动去IDE禁用(几个IDE设置是一样的)。  
 
- 
- 
关闭传递优化、内核隔离、Windows更新(直接在开始菜单搜索) - 
传递优化(开启后在大内网环境下可能引发网络风暴和内存溢出)。  
- 
内核隔离(开着会增大后续影子系统的崩溃可能)。  
- 
Windows更新(Windows 更新(先更新至最新版本,再选择暂停更新约 5 周,我们这里通过注册表暂停了 9000 多周)。  
 
- 
- 
关于热身赛(配置影子系统、准备还原U盘)(非完美方案,可替换) 关于影子系统:该软件已停止更新多年,在 Windows 10、11 系统运行 “单一(完全)影子模式” 时,重启后可能导致系统崩溃,但是不会发生在以正常模式启动的计算机上。原理是在系统启动的时候给C盘记录一个快照,下次启动的时候还原快照(很快,几乎无感)。 - 
取消 “显示完全影子模式” 复选框的勾选(前提:仅存在 C 盘盘符;若有其他盘符,需禁用单一影子模式)。 
- 
默认启动模式选择正常模式(防止正式赛计算机意外重启后选手选错模式)。  
- 
在密码设置里面给单一(完全)影子模式设置密码(不要给正常模式设置,先询问正常模式密码才能设置的话,正常模式留空然后确定就可以设置影子模式的了)。 热身赛时提前开机让志愿者输入密码进入单一(完全)影子模式(如果计算机崩溃见下面说明),这样选手离场后重启计算机就还原了。  正式赛之前一定要预先查看计算机是否能正常开机,不能马上还原系统即可。 解释:备份系统建议使用Dism++的备份与还原功能(在Windows PE环境下),在安装好环境后就进行备份,后续准备10~20个32G+左右的启动U盘(可以用微PE工具箱制作,具体使用教程自行搜索),每个U盘里面准备好备份的镜像,方便热身赛结束后给崩溃的计算机还原系统,操作完成后,所有比赛机需仅以正常模式启动(防止再次崩溃影响正式赛)。 特别的:影子系统的崩溃不会发生在以正常模式启动的计算机上。 
 
- 
- 
关于Windows的激活 下载HEU_KMS_Activator,打开软件前,需在 Windows 安全中心关闭所有实时防护功能。  可以在每个U盘里面拷一个,因为激活的Windows会因为主板ID的不一样而失效,所以可能会需要到时候给比赛机一台一台激活(可以在软件里面尝试KMS38激活,说不定就不会有这个问题了,没测试,不懂)。 特别的:不关掉实时防护会导致软件被删除,而Windows重启后这个功能会自己打开。 软件打开就可以拔掉U盘了,软件的使用也特别傻瓜式,打开后点一下开始等就好了,后面一台一台激活的时候可以两个人配合,效率很高。 
配置ICPC Tools
CDS服务器(v2.6.1325)
我们比赛前配置的时候用的是正式版本(2.5.1082),但是正式赛前最后一次测试的时候发现打星队显示不了,我们又换了个版本(v2.6.1325)。我们实际测试下来,发现ICPC Tools的测试版貌似比稳定版好用,这边先推荐一手测试版本。
- 
配置Config 参考路径: 1\wlp.CDS-2.6.1325\wlp\usr\servers\cds\config对于cdsConfig.xml,连接到PTA需要修改: 1<ccs url="https://pintia.cn/api/xcpc/competitions/<yourContestID>" user="example@pintia.cn" password="yourpassword"/>PTA现在的API不会返回校徽信息,所以我们需要手动补全,在cdsConfig.xml指定: 1<contest path="<yourContest(CDP)Path>" recordReactions="false">额外的,为了确保安全,你可以在accounts.yaml中修改CDS各个访问账号的密码。 
- 
配置补全用的CDP包 在 <yourContest(CDP)Path>中建立名为organizations、teams的文件夹,在其中按学校ID或队伍ID(可在PTA后台查看)建立各个子文件夹,把对应校徽命名为logo.png放入对应的子文件夹,队伍照片命名为photo.png放入对应的子文件夹。注意:学校 ID 和队伍 ID 需与 PTA 后台导出的 ID 严格一致(区分数字 / 字符串格式),否则会导致校徽 / 照片无法正确加载。 在 teams.json中给打星队单独列出来,这样CDS会合并数据,这样就可以正常显示他们(如果显示不了的话),另外可以给他们名字前面加个*来作区分。访问 https://127.0.0.1:8443/api/contests/<yourContestID>/teams可以看到PTA返回的json,复制打星队的下来后改好了放在teams.json中。Example: 1{"id":"194","name":"\u5730\u6708\u732b\u732b","icpc_id":"xxx","group_ids":["1","excludedTeamAutoSet"],"organization_id":"2","hidden":true}修改为: 1{"id":"194","name":"*\u5730\u6708\u732b\u732b","icpc_id":"xxx","group_ids":["1","excludedTeamAutoSet"],"organization_id":"2"}
目录结构参考:
|  |  | 
其它要补全的也可以按照CDP包的格式在这里补充。
- 
启动、停止CDS服务器 先切换到参考路径: 1\wlp.CDS-2.6.1325\wlp\bin打开cmd然后输入 1server start (or stop) cds即可启动或停止CDS服务器,启动后在浏览器访问 https://127.0.0.1:8443/会看到如下页面: 
Presentation Admin (Client)
注意:这里我们建议大家都使用测试版本,因为CDS服务器是测试版本的,Presentation Admin (Client) (以下简称Admin和Client)最好与CDS相对应,尤其是 Client,若版本不匹配会自动更新,会破坏后面的中文配置。
- 
启动Admin端 切换到参考目录: 1\presentationAdmin-2.6.1325启动cmd,输入以下命令: 1presAdmin.bat https://127.0.0.1:8443 presAdmin padm1n这里的和账户仅供参考,具体以在上面CDS中配置的为准。 完成后应当看到如下页面:  
- 
修改并启动Client端 - 
修改字体 切换到参考目录: 1\presentations-2.6.1325\lib用压缩软件打开 presentations.jar包,找到1\presentations.jar\font\Helvetica-Plain.ttf自己去找一个开源免费商用的字体集,我们这里用的MiSans-Normal,但还是有些队伍的名字很特殊无法显示(比如英语的Upside Down版本)。 然后把你的字体文件更名为 Helvetica-Plain.ttf替换进JAR包即可。
- 
启动Client 切换到参考目录: 1\presentations-2.6.1325启动cmd并输入下列命令: 1client.bat https://127.0.0.1:8443/api presentation presentat1on --display_name "{team.name}({org.name})" <--display 2>注意: <--display 2>为可选参数,当电脑连接两个屏幕的时候可以指定在哪个屏幕显示(当且仅当计算机显示模式为扩展的时候)。--display_name "{team.name}({org.name})"可以使得显示为“队名(学校名)”另外, https://127.0.0.1:8443/api意味着Admin、Client只能运行在运行CDS的电脑上,如果需要配置其它电脑显示Client,选择Frp内网穿透或者是把几台电脑组在同一个网段下。我们这次CDS和Admin运行在同一台电脑上,Client运行在另外4台电脑上,MCZS即本Blog的服务器技术支持组提供内网穿透服务。 
 
- 
上述步骤完成后,应当看到:
Admin:

Client:

然后在Admin中右侧拖动对应的画面到左侧的Client上即可显示。
另外,Admin中点击右下角的New...按钮可以设置轮播。
Resolver
注意:Resolver的2.5.1082版本貌似存在bug,SplashPresentation被安排了将近10年的显示时间,表现为开屏就卡住了,这边建议还是用测试版v2.6.1325的来滚榜。
另外,PTA的API返回的数据没有更新到CDP包最新的标准,目前用v2.5.830才能正确获取数据,所以,我们的方案是用v2.5.830的awards来获取和设置奖项,v2.6.1325的resolver来滚榜(因为这个版本的动画优化了)。
但是,我们发现打星队伍无法显示在滚榜中,赛后发现原因是PTA给的数据中给打星队加了个hidden: true属性,在event-feed.ndjson去掉就好了,修改方法同CDS的teams.json,在此不再赘述。
注:awards有缓存,多次获取后,可能一个队有多条记录,都要改。
我已经向ICPC Tools提出Issue,得到了这个问题的回复,PTA给的API也占一部分锅。
ICPC Tools的缓存位于:
|  |  | 
当json信息多余时候,请查看该目录下的各种类似这样org.icpc.tools.cache.httpspintiacnapixcpccompetitions<yourContestID>的文件夹,然后删除。
推荐:自己去把PTA的event-feed.ndjson下载下来,然后用awards导入。
可用下面的命令:
|  |  | 
在此向地月猫猫队致歉,因当时未解决该问题,导致其未能在滚榜画面中显示。
补录的滚榜视频本节末尾。
API问题我们已经向PTA提出(但其实也可能是ICPC Tools的问题,PTA的人已经向他们提出Issue),他们也在内部仓库提了Issue:

- 
获取 event-feed.ndjson数据- 
运行 awards.bat (sh)切换到参考目录: 1\resolver-2.5.830运行 awards.bat (sh)看到如下窗口: 点击 Connect,看到: 说明获取到了正确的数据,设置完奖项后点击右上角的 Save...按钮保存文件。注意:文件需要保存到之前CDS中设置的 <yourContest(CDP)Path>,文件名为event-feed.ndjson。
 
- 
- 
配置翻页笔 首先查看你们翻页笔对应的键盘按键(一般是上下箭头), 然后下载AutoHotkey。 新建一个 txt文档,填写:1 2Up::Numpad1 Down::Space修改扩展名为 .ahk,然后双击运行。补充一下滚榜常用的快捷键: 快捷键 功能 小键盘2 快速跳过 小键盘1 上一页 + 加速 Space 下一页 
- 
使用 v2.6.1325进行滚榜- 
修改字体文件: 切换到参考目录: 1\resolver-2.6.1325\lib找到 presentations.jar,具体替换方法同Presentations Client,在此不再赘述。
- 
运行resolver 切换到参考目录: 1\resolver-2.6.1325打开cmd输入以下内容: 1resolver.bat "<yourContest(CDP)Path>" --display_name "{team.name}({org.name})" <--display 2>参数的解释同 Presentations Client,在此不再赘述。
 
- 
[补录][无解说]2025 CCPC 女生专场滚榜[打星队已补]
关于奖项配置的说明

- 
设置 First Solve:点击 Add Awards区域的First to Solve...按钮,弹出的窗口中直接点Apply即可。
- 
设置冠、亚、季军: 点击 Add Awards区域的Rank...按钮,弹出的窗口中选择好需要的排名后点Apply即可。 
- 
设置金、银、铜奖(以Gold为例): 按住 Shift键选中该奖项对应的起始队伍与结束队伍,然后点击右侧的Add...按钮,弹出的窗口参考下面的设置: 其中 Stop to show details会显示队伍的照片,对于每个奖区,可以把上面的 Type改为Other,Citation设置为Gold List,下面选择Show as list,则在滚到这个区域最后的时候,会有一个视觉上的提示(下图高亮部分),然后进入List展示,后面显示该奖首队伍照片(前提设置了Stop to show details)。 同理,其它的奖项也可以通过 Other设置,resolver会在把该奖区除了首队伍的其它设置了Stop to show details的队伍展示完成后才显示List。要替换比赛logo的话,参考上面的 CDP目录解释。
使用PTA的小票、代码打印服务
购买 PTA 相关服务后,可在 PTA 后台查看该功能入口:

把打印机配置好了以后直接进入工具,点击开启自动打印,会提示给浏览器加上--kiosk-printing的参数(我们这里测试过只能用Chrome),我的意见是复制浏览器图标并添加该参数,因后续可能需调整打印设置。
另外,打印小票的时候去掉勾选“页眉和页脚”:

我们的代码和小票是分到两台电脑上的。
写在最后
本次比赛在志愿者团队与技术组的共同保障下圆满落幕,也收获了参赛选手的一致好评,最后附上技术核心三人组合影及全体志愿者大合影。

(技术核心三人组)

(全体志愿者合影)
