记北京师范大学第23届程序设计校赛
比赛前

可以从【比赛日程表】上看到日期写的是【2025-4-13】,但是因为【2025-4-12】北京罕见发布了橙色预警,所以取消了一切活动,当时推迟到了现在的比赛日期【2025-5-17】,以为还很远实际上很快就到了。
赛前准备当然就是准备板子了,打印了自己一百多面2023年CCPC Fianl准备的LaTeX板子,再找xxc要了他的板子。
💡关于板子:用别人的板子其实很难,哪怕别人最好就像鞋子一样,没有磨合拿来直接用其实是很难的,最后我没用到
再说一嘴,和以前打区域赛一样,其实比较难用到板子,我们队大哥从不带板子(虽然南京站如果有板子就银了..)打了两百多面后面听说工位打印机要收费了。
12:00比赛,坐了9:30的校车前往海淀校区,然后去签到,那个时候已经没什么人了,伴手礼好评!自己开始热身测试,测试各种头文件和函数以及其他的一些操作,太久没有敲C++,我都忘了编译指令那个--stdc++=17
应该放在哪里... 最后确定下来了写在了纸上g++ A.cpp -std=c++17 -o a ; ./a



测完之后,那就是吃饭咯,我还挺喜欢海淀食堂的,比我们昌平食堂好太多。这个好指什么呢?听过田忌赛马吧?我们昌平食堂的上等马都打不过海淀食堂的下等马,就这个概念。

吃完就准备开始了
比赛中

首先写一下整个思想过程。因为比赛通知我们推迟五分钟开始,为了方便查看,我这边把时间同时减少五分钟,比赛时长5小时,从12:00到17:00结束。因为我那时候已经开到纸质题面的A题了,也就是签到题很快就能写出来,但是我喜欢给自己敲很多的头文件,这个一血也没有必要抢了(python更快)。其实这次抱着一个去玩的心态,毕竟有两年没有打过比赛敲题了,但随着逐步得做出来,我也会关心自己的排名,发现也可以保持在前面并且有题目和手速的优势经常第一,那么我的心态就发生了转变了,听我娓娓道来。
- 首先当然是做【A题】签到,手速慢一点,没关系毕竟比赛才刚刚开始(反正我一血也没有气球)【1发过】
- 第二题我就去开【F题】了,一道题面还算简单的数学题,凭借我的老道经验秒了,但这个时候好像有人开了更多的别的题,F题的一血还是我的【1发过】
- 跟榜去做了【L题】,但WA了一发!原因是自己有一个变量打错了,血亏5分钟和20分钟的罚时【2发过】
- 接着【D题】很多人做了,我几分钟秒了D题,并且欣赏一下自己的代码,经过这么久的代码练习自己的代码已经比较规范比较好看了~【1发过】
- 其实我此时的心态还并未一直站到第一,我选择开一道能拿一血的【I题】。其实题面的需要转换思路也很容易看出来,但是有一个点写DP或者贪心,怎么写都不好实现,自己此时有点急了,因为已经花了很长时间,当然排名下去了不少,交了一发WA了
- 在wa的D题之后,【H题】已经有很多人过了,我很快就把这个题过了,就是一个简单的初中数学题... 【1发过】
- 接着回来写【I题】,我暗自下定决心一定要做出来,最后突然意识到二分不就好了吗?大概调了十多分钟过了,但我当时觉得过了好久,可能是自己那时候急了【2发过】
- 此时已经6题,大概一直能保持第一了,时间还有三个小时呢,越往后越吃力,因为自己脑力废了很多再加上题目也越来越难,我选择做【C题】这个大模拟。大模拟就是傻瓜题,心态还不错慢慢读题,敲代码,WA了再一个个仔细看,自己出数据,花费一个半小时过了【3发过】
- 还有一个半小时,并且马上要封榜了,和附近排名的人咬的也很紧,所以一定要在做一题,【K题】是有人做的,那我一定也能做出来。其实我那时候还在犹豫做那道树的题目,我觉得我也能做出来但是没时间了。
- 【K题】很快找到异或的性质
a^x=b
可以通过两边同时异或a
得到a^x^a=x=b^a
。第一反应会是DP?但通过样例猜测到了应该是一个一下输出答案的值,写了一个差不多的但马上wa了,看到了第二名在封榜后交了两发就没动静了,凭借我的经验大概率是过了,我此时有些急,然后发现bug马上叫了一发还是wa了,我又发现一种情况不可以,然后加入了并查集。在最后的五分钟我去上了厕所!冷静思考了一个方案,回去稍微改一改不管了直接交,过了!
个人向题解写在最后
比赛后
比赛结束!我本来都想和对象一起出去吃蛙来哒,我马上想好话术打算和她说留下来看看结果,因为我算了一下大概我还是第一,我相信他封榜不会过第二题,我想看到大家看榜单时候,看到第二名封榜首先绝杀了我,再被我绝杀回去的场景,简直不要太刺激!于是吃了小米鸡排(番茄味和咖喱味...)就去颁奖现场了!




前面就是副院长、赞助方以及同学讲话,当然最重要的就是滚榜了,其实此时我很紧张,我知道大概率是第一,但是我就怕那小概率我不是第一。(此时心态发生了很大的变化)
直接来到滚榜,其实滚榜的前主持人好像稍微透露了一下我是第一,但是被他圆回去了(我个人推断,但我还是紧张),他还问“黄恺瑞来到现场了吗”,我举了左手,因为我的右手在手机相机录制...
滚到铜牌的之后大家上去领奖,银牌之后大家去领奖。慢慢的就来到了金牌区,金牌区没有几个人了,但先发冠亚季军其他金牌,然后慢慢揭晓冠亚季军。我此时全程录制了,到时候会剪辑一下发出去记录下吧哈哈
慢慢的此时只剩下了我和那个冠军(因为我不是正式选手,我是打星参赛,换句话说我就是不参与正式排名来玩的一个人),慢慢揭晓他封榜过了那题直接到了第一,全场惊讶声音,哦对了,他在听到亚军封榜没过题的时候他振臂欢呼庆祝自己的冠军位置。
接着滚榜千问大模型,过了到上面去了。接着就要到我了,主持人说还有悬念,看人类是否能战胜大模型,然后我也听见有同学台下念到我的名字,揭晓了我298分钟提交的那一发,过了!我成为了冠军上面的人,主持人称呼无冕之王🏆,感谢,我都不好意思了哈哈哈哈(矫情一下
最后千问大模型9题再次超过了我。
可惜我是打星参赛,没有奖杯🏆、奖励和一血气球等,也没能上台,不过回想起我的初衷,就是来这里玩一玩,能拿到第一我已经很满意了,还认识了ACM一些朋友,回去发了个朋友圈纪念一下,我就是如此喜欢纪念呢。

感谢观看!
个人向题解
A. Robin的字符串压缩(签到)
判断是否超过阈值k
,比如university
要写u8y
,我用string
就直接输出cout << s.front() << s.size()-2 << s.back()
,当然要if判断一下
F. MathMagic(数学)
给正整数数组a
,求在两个不同的a_i,a_j
情况下,\frac{a_i}{a_j}+a_j
的最小值是多少?
可以观察到数据最大10^5
,那其实我至少可以for
循环一遍,那么就会想到固定a_i
分析函数是一个对钩函数✔,那么就是二者相等时候,求解根号附近选择左边还是右边呢?其实直接把附近的四五个for循环一遍就好,不会大到哪去
L. 圆中圆(几何)
给出x
轴上的一个圆,给你一个圆心,求问这个圆半径至少多大可以把开始的圆给包括?
分析三种情况即可,圆心在给定圆的左边、中间、右边即可,这种题大不了再判断中间是靠左边还是右边。
D. Apex Legends(枚举)
n
个选手有能力值,一个团队有三个人,能力值是a_i+a_j+a_k+a_i\cdot a_j +a_i\cdot a_k +a_j\cdot a_k
n
不大直接枚举即可
H. Betty(几何)
给你圆弧两个端点(x_1,y_1),(x_2,y_2)
并且给出圆弧到这两个端点所在直线的最大垂直距离。求这个圆弧的长度
平面几何听起来很高大尚,其实就是中学数学,画图分析求解方程即可
I. Generals(二分答案)
generals.io的游戏类型,简化了一下,有我方和敌方的兵力,并且给出一张图,敌方大本营和敌方防御塔每秒都会增长1
兵力,最少需要多少可以到达(n,m)
呢?
我玩过这个游戏(怀念22年的那时候),所以很快理解的。然后因为必须一直向下或者向右,所以可以直接用曼哈顿距离把每秒增长的动态直接静态加上对应格子数,再加上每次合并的时候会减少1
也直接预处理了。
最后就得到了一个方格,很像求解最大路径最小路径的DP题,但是它要求的是中途不能小于等于,也就是如果你的路径是1,-5,-6,1000,-5
都是不可以的,我苦思冥想如何去记录,最后发现用一个二分答案不就好了吗?控制一下如何变化l,r
和输出是什么即可
C. Replay(大模拟)
魔塔游戏(我也玩过)简易版,输出最后一个执行序列之后结果是什么,是Win
、Record ends
还是Record error
。
情况很多,但是慢慢来,有些复制粘贴也可以但要注意不要出错。
这里有一个很重要的点就是,题目没有讲清楚的情况下先别质疑题目,很有可能是坑存在的地方!
我主要WA了两个地方:
- 如果有攻击力
A
小于敌方的防御力D_i
,那么会一直都打不过,我没有处理 - 获得属性值的地方只会有一次能够获得,其实这里题目没有提到,但是凭借我玩游戏的经验走到加血的地方就会消失,不能重复(或许是出题的锅)
就是考验些许的读题能力和代码能力
K. 霍格沃兹加密难题
给一张图(n=m=10^5
),每个图都有一个强度值,初始相邻不会相等。对于10^5
次询问,每次给出一个x
,你可以选择让图中任意结点进行异或,使得异或之后相邻的还是不同,问方案数,答案对10^9+7
取模。
思路:
-
首先就是我提到的,比如现在有两个相邻结点
a,b
,如果对x
异或之后变成了a\oplus x
和b \oplus x
,如果之前不相等的话现在当然也不会相等。 -
如果此时是
a
变但b
不变呢?那就是寻找a\oplus x
和b
的关系,有a^x=b
的话那么转化为x=a^b
,那么就可以预处理出相邻的两个点a,b
,只有当x
是a^b
的时候才会影响,不然没有一点影响!然后用排列组合,用费马小定理处理除法即可。 -
此时我交了一发统计数目的,WA了!问题就出在这是个图,如果是一个环呢?我后面改了一个统计两个点的值里面是否有
x
,如果左右都有的话那么此时就不用算了,但WA了!因为如果正好是边的中间也是一样的效果 -
最后我使用的是并查集和STL,将并查集来处理是否是一个连通块并且已经处理过,代码有些许的复杂(可能是当时没时间急了)
最后上个厕所回来绝杀了