GDKOI 2025 流水账(不是游记)
GDKOI 24 是 24 年一月办,GDKOI 25 是 25 年十二月办?
——间隔了两年……
对我来说,上次打 GDKOI 还是很久以前的记忆,我们去了东莞一个非常偏僻的地方住上了一个酒店,然后周围没有任何可以玩的地方,任何都没有,荒无人烟,而且距离比赛地点又远,每天要坐车来来回回……
哦,这不是 GDKOI 24 游记,这是 GDKOI 25 游记。
GDKOI 24 给我的记忆并不是很好,我差点打铁,第一天没过签到,第二天最后十分钟过签到终于拿下了铜牌倒数。而且比赛地点附近又没有什么好玩的地方,并且没有带电子设备,只能用酒店的小度玩 https://generals.io/。
所以,这次的目的,就是在两天的比赛中,拿下银牌,守银就好。
你说什么,两天分开颁奖?第一天 IOI 赛制第二天 ICPC 赛制?还有抽奖环节?什么时候 GD 这么有格调了。
Day 1
Day 0 的事情抛开不谈吧,大概就是躺在酒店玩了一个下午的手机,你说面积?太冷了不去不去。
打开电脑,发现说好的是 Ubuntu 24,结果是冰冷的 Windows。原来我们 402 考场因为设·备·原·因只有 Windows 啊,这样这样,也不是不能用,让我打开 vscode 看看。
哇,原来是死机了的电脑呢,让我等个几分钟让它老人家缓缓,然后熟练地更改快捷键和相关设置。接着……Ctrl + W,哇,怎么没有关闭当前标签页呢,怎么打开了智·能·云·课·堂主页面,哇塞,牛逼欸,是哪个神人想出来全局占用这个快捷键的。
让我再写一段 Hello World,哇,怎么 Ctrl + A 也用不了,哦\~原来 A 键很不灵敏呢,真是太棒了呢。让我 F5 运行一下——天哪,竟然是高贵的 MSVC g++,竟然一点都没配置过呢!
遂光速修改配置文件改为 Dev-C++ 的 g++,只能这么做了,我不知道为什么 MSVC g++ 跑不了一点,而且代码补全全是坏的。
欸,怎么没有输出……哦,My God,原来是神人配置呢,这么命令行输出不了一点东西呢,让我写个 freopen 吧……欸,怎么没有效果?
经过我几分钟的缜密分析,我将 freopen 的地址改成了绝对路径,然后就看到了输出的文件。
哇,原来这么厉害,还要写绝对路径。
让我试试关掉同步流吧——
然后就没有输出啦!
至此,我已经完全掌握这台神人 Windows 电脑的相关信息:不能用 Ctrl + W,不能用 A,不能用标准输出,freopen 不能用相对路径,不能关闭同步流……
而且,操作不能过于频繁,否则会死机。
现在距离比赛开始还有五分钟,让我静坐一下吧……
什么,你说 IOI 赛制用的 cms 系统,现在就可以登录。
等等,为什么,我登不上去。
经过一番调查,几位志愿者终于弄明白了,我的网线坏了。
好吧,我不能说我完全掌握了这台神人 Windows 了(至少,在开始之后又坑了我几次,这些是后话)。
遂光速更换到备用机子,进行重复配置,终于在开始之前配好了。备用机子的 A 键是好的欸。
※※※
打开 T1 后我的电脑又死机了几次,然后又遇到了一大堆无法运行的问题,最后我大概在九点左右熟练掌握了调试技巧。
没有关系,反正比赛也延时了半个小时,这不是刚刚好。
T1 呢,剥开外皮之后,大概是一个求方案数的东西。而且是很有性质的若干个数相乘小于等于某个数。我首先就想到了删掉所有
写完代码,再跟 Windows 系统鏖战一会儿,然后终于在九点二十几时通过了。一遍过。
说句闲话,这个 Dev-C++ 的 gdb 是有概率看不了 STL 容器的内容的,原因不明。
※※※
打开 T2,发现可以直接优化建图 dij 做掉前两种边(父亲和子节点,父亲是容易的,子节点也就是后辈节点,可以直接建另一张一样的图,每次从当前点连出去,这张图上所有边都是免费的,但是跑回主图时要付费
欸?我哪里写错了吗?不过不要紧,这是暴力,我觉得可以放在最后来调试。
然后对着题目接着想,思考怎么才能刻画同一层的之间连的边……刻画同一层的点的话,就是刻画一个树中的一部分点——虚树!
对于每层的点建出虚树,在虚树上优化建图即可。
写完这部分代码是到了十点半,样例过了之后交上去发现拿到了链的分和一个
欸?
不对,难道我也写错了——但是,
我的正解和暴力是分开写的,既然都有地方错了,总不能错得一模一样吧。
那么我写了一个对拍——
拍不出来?!
这真是太诡异了,好在 cms 可以显示 checker 信息,它提示我两种做法都在第 86 行出错了。这么巧?
此时只有一种可能的答案了,我读错题了——
经过我的重新阅读,我发现了:子节点,是儿子节点啊,不是后辈节点。
十一点钟,通过此题。
※※※
打开 T3,看起来非常可怕。
正着计数似乎不是那么好做,考虑计数没有三层嵌套的吧:发现当你有两层嵌套时,最左侧的匹配上的左括号左边不能还有没有匹配的左括号。所以当你打算匹配左侧括号时,若中间已经有一个匹配成功的括号对,就只能连最左边的未匹配左括号。
先口胡了一个
这种计数 DP 的调试方法是比较经典的,维护一个 vector<vector<int>> dp 数组,用这个数组存具体的方案。最后就可以与暴力比较判断得出自己的计数哪里写错了。
然后发现是我之前口胡错了,每次匹配左侧括号不一定要匹配完,可以只匹配一个。
写完发现自己实际上写的是
等等,那我写
现在是一点钟,还有一个小时。赌吗?
一边是完全没有细想过的 T4(实际上开始时想过,不过总·不·能·随·机·化·能·过·吧),另一边是可能可以多拿二十几分的 T3。
我选择了后者,写了
发现根本过不去
45 分跑路。
※※※
还有半个小时,用了十分钟拼了 6 分,然后写 dp 做出 8 分……
欸,怎么还是拿不到 8 分?!
经过我的不懈调试,最后也没有能够调出来。
好吧,6 分,总之,肯定有银了吧。
※※※
所以,T4 随机化能拿到 78 分?
拿到了 100+100+45+6=251 分,rk 60,总能有银牌了吧。总共 240 人,按照 123 的获奖比例也有了吧。
肯定守银了。
Day 2
ICPC 赛制,队名是经典的 danielqf takes me fly。但愿真能飞吧。
在飞之前,我们就发现,怎么没有纸质题面。
哦,原来正在打印……
嗯?!
比赛开始后依旧没有拿到纸质题面,遂开始使用电脑读题。三个人滚鼠标看题,A 题看起来是我不擅长的计算几何,B 题没看清,不是那么一眼。C 题……
lnw143 在我连题面还没有读完时就会做了。
等他开始写代码时我才大概弄懂了这题在做什么,就是一个 lca 和并查集。
lnw143 果然还是稳,不愧是金牌✌。7 分钟抢下首杀。
此时我们继续看题,我们一起看的是 I 和 J,I 似乎很像之前某一道 cf 题目,数据范围也很可以分块,但似乎并不好做。而 J 可以枚举每一个喜欢的某一个人来计算贡献,不过当时也只是一眼扫过去也没细想(悲惨)。
然后 fydj 开始想 D,H 题也有人过了,lnw143 开始想 H,纸质题面也终于发了下来。
欸,我在做什么呢?我在想 L。
D 题写完一部分代码之后,lnw 想到了 H 然后过了(26 分钟),然后 D 题在 35 分钟时也写完了,结果 T 飞了。
L 此时有人过了,lnw 接手 L 的工作,并在 55 分钟时写完通过。这段时间内我注意到 G 通过了,于是开始想 G。
G 是一个计数合法的东西的状物,那么经典做法是造一个自动机。但是我造的自动机状态数为
那么另一种思路是对每种做法确定一种唯一匹配方法。不难想到一种做法,手模样例正确。此时大概过了 90 分钟,不过电脑仍旧被占用,所以开始想别的题。
我选择了 F(当然是什么都没有想出来)。
在我 129 分钟时写完 G,我们已经在 D 罚了 9 发。仍旧没能通过 D。
然后我想支援一下 D,发现我会了一个小常数做法(二进制分组,那么就需要实现「统计一个矩形内删掉所有为 0 的数之后只剩下一种数」,维护每一行上一个和它不同的数的位置是
好吧,现在快要到 12 点了。fydj 会了 F,开始写代码。
然后 lnw143 大胆提出 A 随机化做法,于是他和 fydj 开始交叉写题。最后我们因为随机化实现的不够好看,所以跑了大概二十分钟,这段期间 fydj 将 F 通过后我们注意到 A 跑完了,打表之后就通过了。
此后我们一起看 J 和 M(我看 M),M 完全不会,J 大家会了一点集合幂级数可以做到
封榜后过了两题,总共七题,rk 13,银牌回家。还是被带飞了。
然后颁奖告诉我 day1 我只有铜牌,6。是不是因为这次人太少了。
煽情什么的懒得写了,累了,一边去吧。