ICPC 区域赛 武汉站 游记

· · 生活·游记

:::warning[剧透警告]{open} 警告:本文包含剧透内容,涉及比赛包括:第 50 届 ICPC 国际大学生程序设计竞赛区域赛武汉站(热身赛),第 50 届 ICPC 国际大学生程序设计竞赛区域赛武汉站。 :::

赛前花絮

2025.10.29

快要比赛了。

高中生都在脱产加训,那我也一定要加训了吧。

不对啊我下午英语演讲的 PPT 还没做!不对啊周五的化学实验还要提前做掉!不对啊我周四根本没空做实验!

于是我这一天压根就没训练。

2025.10.31

穿上带着猫猫图样的衣服和高中的校服外套,准备出发。或许没能找到代表初中的元素吧,但或许还是这两件衣服更能代表我。

早饭是十月在学校吃的最后一顿饭了呢。

本来跟队友约的十点机房集合的,结果小包落数学教室了。于是激情折返跑。

在机房门口和队友打了两把 cr 友谊赛,第一把我精锐绿胖狂暴电车对上他水人,虽然他带了火箭但并不能同时防住精锐和电车,于是被我打进去了。第二局他换上了卫队四猪,也是被轻松 0-2 了。

上高铁前打了 Rotaeno 的六兆年と一夜物语,绿谱,蓝谱,橙谱都轻松理论了,紫谱打了个 15 小 AP,不想再推了。白谱打的一塌糊涂,连 EX 都打不到,于是发 QQ 动态的时候用了一个月前打的 100.5w 的成绩图。

高铁上试图加训,但我刚上高铁就开始睡觉,偏偏又挑了一场难度高的,于是等我睡醒了开始想题时已经没有简单题了,结果想破了脑袋也想不通。于是三人(或者说,两人一猫?)集体坐牢。最后加训以另外两个队友一个睡觉另一个看电竞比赛告终。

晚上到达武汉。订酒店时定了两个双人房,两个队友各进了一个房。那我怎么办?

_Vector_ 在群里表示要早点睡,第二天早起理板子。realman 则表示自己可能要晚点睡。于是我搬到 _Vector 房间去了。他开门的时候已经熄灯了。

第二天早起理板子了吗?显然至少我没有这么干。

热身赛 —— 2025.11.1

签到。

到场的时候还没开始签到。现场有主办方组织的各种小活动小游戏。然而我似乎并不是很感兴趣,而且人太多了,于是我选择了在外面待到开始签到。

签到时有个陌生同学通过我穿的校服认出了我是来自哪个高中的,虽然我根本不知道他是谁。

和高中同学聊了一会,发现昨晚睡觉的时候忘记给手机充电了,于是没多久与高中同学失联了。

回酒店理了一下网络流的板子。把带负圈的费用流写了,顺便把上下界网络流重写了一遍。

下午热身赛。A 题是 A+B problem(对,就是 P1001 那种),B 题是个构造,往年区域赛的题。C 是个交互。D 题是去年昆明的题目。

realman 把 C 秒了。_Vector 还记得 D 怎么写。我稍微想了一下回忆起了 B 的做法。那做完了?可我们电脑都还没打开呢!

终于等到了工作人员打开我们的电脑,real_man 把 A 光速写完(不然呢),然后我把 B 写了。realman 在写 C 的时候,我问清楚了 D 的做法。于是我把 D 写了。写的时候往右端点的参数传了个区间长度,调半天调不出来,最后还是 _Vector 发现的问题。

怎么会犯这样的问题呢?明天再这样怎么办?

然后 _Vector_ 测了一下评测机的机速,接着就提前离场了。

回酒店做了一下 CSP-J 2025 的题,结果在 C 题甚至罚了一发。晕晕。

real_man 找同学玩了。

ShwStone 到武汉了,并表示他的两个队友来不了,他这场要单挑。

晚上我跟 hwp 还有 ShwStone 出去吃饭。

我:“这个点三人一组的是不是都可以视为来打 ICPC 的?”

ShwStone:“那我们是什么情况呢?”

整体气氛非常欢乐。就是……

明天出场后还能这么欢乐吗?

吃完饭找了家打印店把板子打了。回到酒店,收好行李,定好闹钟,早早睡觉!

然后睡了一觉醒来发现是晚上十一点十四分。

正赛——2025.11.2

启程。

早上八点,随着起床铃声 Inverted World,拿上行李,前往赛场。

到了。

把板子和证件拿出来,放到比赛桌子上。无所事事的我目不转睛的盯着身后大屏幕上的倒计时。

旁边气球颜色展示中 G 题只有一个气球,其它题目都有两个,会不会暗示 G 是签到?

比赛开始。我拿到英文题面(众所周知,我读中文题面会读错),直接看 G,然后发现显然不是我的题。于是倒序开题,看到 M 是个构造,这题可做!

什么?行列式?子主矩阵?这都是什么东西?

再看 L,哇,又是矩形又是折线又是概率的,完全不可做啊!再看 K,又是一个神秘构造。再看 J,字符串,那更不是我的题了!

那我是来干什么的?

“这个 C 是个构造,或许你可以看一下……”real_man 说。

C 要求往一个网格中填入等量的 0,1,2,使得每个数分别构成一个八联通块,且横向或纵向上均没有三个连续的相同的数。我尝试先把 01 填入网格,然后再用多米诺骨牌覆盖盘面,将覆盖的位置作为 2,但似乎并不好表示限制。

16 分钟时,real_man 把 E 切了。

看了看榜单,F 过的比较多,A 也有队伍过了。我决定先想 F。队友在看 A。

F 是个相当简单的题目。由于本质上递归树的形态是自定义的,因此,只要求出最小的点数,在加一取个 \log 就做完了。那就是一个典型的区间选点覆盖,贪心就能做了。我准备和 _Vector_ 说我的做法。

“你会了你就直接写,我们队签到题不需要讨论解法。”

于是我上机了。然而我并没有把怎么实现理得很清楚,稍加思索之后选择用堆维护,在 26 分钟过了。事后想想,其实直接用一个变量维护当前这一段的最小值就行了,复杂度少一个 \log,不过无伤大雅。

队友跟我说了一下 A 题的题意。然而很显然的,数学并不是我擅长的方向,于是稍作思考后我又继续想 C 题。

我改变了我的思路:当 n=3 时,可以容易的构造出一种方案,每列的 0,1,2 各一个。由于 nm 一定至少有一个能被 3 整除的,因此,可以令 n 是能被 3 整除的那一个。接着,对于第 46 行,只要把前 3 行镜像下来就行了,这样只要 m \le 4,它一定是联通的。后面同理。对于 m=2 的特判一下就好了。

写完代码,测样例通过了。好像还没有队伍通过这题!难道说……

啊,WA 了。为什么呢?

哦,好像 m=2 的情况稍微有点问题。改完了再交——咦,怎么还是不对?

趁着这时,_Vector_ 把 M 先快速码完过了。此时是 1 小时 6 分钟。

调试了很久的 Corner,叫上了 real_man 一起看代码,才发现问题根本不出在代码上,而是第偶数次镜像的时候,最小连接处并不在第四列而在第五列!于是我对 m=4 的情况重新单独构造了一下(先把前三列填好,然后第四列特殊构造一下),改完代码,在 1 小时 34 分通过了,是第五个通过这题的队伍。

有点可惜,如果在第一遍写代码的时候看出这种情况的话就拿到一血了。

“应该有铜牌了”。通过这题之后,我说。

铜牌当然不是我们的目标,但是,我确实感觉有点底了。

榜上还有 A, H, K 三题。这 A 怎么还是做不出来呢?

于是我去看 H。结果很巧的是我刚看懂题目,还没想一会,real_man 已经大致会了,大致是在一棵 01-Trie 上同时找左子树最右边的值和右子树最左边的值。于是我接着看 K。

跟 _Vector_ 交流的时候,我摸索出了“使用 3 步操作和 dis 的代价交换同一个数组里的两个数”的性质,然后想出了不限制操作次数的做法。但怎么卡进 3n 次呢?

我决定上厕所。但好巧不巧刚好撞上同校的 shwstone 前脚走出赛场上厕所,按规则我只好在门口罚站等他进赛场才能上厕所。于是在门口理了一下 K 题思路,没有取得太多的进展。

回到座位,我意识到一个数具体在哪个数组根本不重要,只要知道它在哪个二元组里就好了,这样可以把交换压到 2 步操作。再加上第一步把两个数组中的数配平用 n 步(实际上是 \frac{n}{2} 步?不重要),跟题目中的 3n 对上了。

此时是 2 小时 26 分钟,real_man 把 H 过了。我跟他同步了一下 K 的进度,然后正说着,突然意识到——如果以 A 为参考系换 B 换不了,那就倒过来以 B 为参考系换 A 啊!理了一下感觉很对,于是上机写了。

上机写的时候发现前面“配平”根本不用做,那操作次数是严格 2n 的啊!难道爆标了?

3h 时,我测完样例,确认没有问题,于是点下了提交,转过身去看大屏幕——

变绿了!

“拿下!”我拍了拍桌子——然后去上厕所。

暂时排在第 16 名,可能已经金牌了?

回座位,感觉 A 还是不可做啊。为什么有队伍那么早就过了呢?G 也完全不是我能处理的题目。不如看看可能更熟悉的 B 题,图论题。real_man 告诉了我题意,我又读了一遍题意,结果发现对不上。我仔细的一个词一个词对了过去,然后问了一句:

“它没有说最大吧……只要每个端点都选出一个点就对了……吧?”

结果还真是如此。于是 _Vector 很快想到了这是个类似 2-SAT 的问题,并且可以使用线段树优化建图的方式优化(我前两天梦到的知识点怎么会以这种形式出现在赛场上)。于是分工就很明确了:_Vector 把建图,求解和输出方案的部分写了,而 real_man 负责处理连边的一些前置工作。而我……喵喵咕噜咕噜?

于是接下来的一个半小时我就跟不存在一样——先是通读剩余题目,尝试将网络流这把钥匙代入,看看能不能插进这些锁里面——显然不太可能。于是又去看队友的代码,但除了翻译爆出的编译错误的意思以外没有什么作用。

比赛一分一秒的走到了尾声。

“就剩半分钟了,要不交一发吧。”我说。

但是样例都过不了的代码提交了有什么意义呢?最终我们也没有这么做。

比赛结束了。线段树建图的部分已经确认无误了,可惜 2-SAT 的部分调都来不及调。成绩定格在 6 题 568 罚时。

数了一下封榜后过题的队伍,应该不会把我们挤下去吧?

另外两只队伍也都是六题。能不能给三块金牌?

讲题了。

正如 M 题的名字一样,这场前期简直是“构造王国”——总共 6 道题,5 道构造。这场是谁组的题啊??

B 题思路完全正确!虽然还差一点没有调试完,但是队友还是太厉害了!

A 题是个类欧——与我而言只存在于传说中的算法。G 题更不讲道理,数学分析都来了。这哪里是我一个不会数学的选手该做的题啊。

D 可以用流做!但连讲题人都没有详细的讲述如何证明流做法的正确性。看来做不出来也正常了。

I 题是个神秘题。可能回头补一补吧。

来到滚榜环节。榜太长了!我要饿坏了!要不先去找点吃的?

食堂居然在 1.5km 之外,完全不可能吃完饭再赶回来!这一定是阳谋!于是我们刚走出会场又走了回来。

滚到 5 题前排了……封榜后过题的队伍好多……诶 ShwStone 的 912 罚时怎么感觉不够(金)啊?

坏了真不够!

银牌怎么还没结束?怎么麒麟王也是银牌?

银牌区还没结束吗……

诶屏幕上显示的是“Gold Medal Winner”了!我们还活着!!

金牌线停在了 6 题 831 罚时。

或许有点可惜,ShwStone 但凡有一个队友就金了,麒麟王但凡少 3 发罚时也就金了。不过至少,这赛季我们学校已经拿到金牌了。

我们拿到了第 32 名,校排 20,凭借前期优势在 6 题队中排在第二。或许把 B 题调出来校排还会再高一些,但这都已经是过去式了。

我实在太饿了,于是在获得同意之后把队友没吃完的早饭午饭给吃掉了。后来到高铁上尽管知道盒饭不可能好吃,还是买了一份,吃得一干二净。然后跟 _Vector_ 分享了一些他出的题目,很有意思。分享了一些我自己出的题目,不知道为什么他总是觉得我评低了。

回到学校,走进寝室。寝室一如既往的没几个人。我仿佛刚从梦中醒来,似乎什么都没发生过,就像我刚刚从一个普普通通的晚自习回来一样。

但这并不是终点。

这只是我们的“六兆年零一夜的 ACM”中,开端的一夜。