Loading

[游记] ZJOI2024 游记

Day 0

最紧张的一天。

一切都很如梦初醒,甚至很难接受“也许是最后一场比赛”了呢。

一反往常地开始写模板,开始看之前看过的题,开始阅读很多考前 Reminder。

一切的一切似乎都带上了很多沉重感……身边的每个人对自己说的话都渲染着一种风暴之前低气压的氛围。

早早理好了第二天的文具,在一个偏早的时间点选择了提前入睡,却不断辗转反侧。第二天的无数种可能在脑海中不断轮播,让自己在焦虑和恐惧的氛围中被一圈一圈地折磨着。

最后度过了一个无梦之夜。

Day 1

起床的时候不算太困!很正常地进了考场,准备开始第一场试炼。

解包,三个题分别有 3,7,10 个样例,看起来强度尚可?一道题目还下发了 io.cpp,看起来可能是数据结构题?

开题,wind 是一个数学题。首先可以想到枚举 \(\bmod n\) 对所有模数取最小值,对于每个模数相当于要求函数取值 \(<0\) 的最小 \(x\) 坐标。

稍微一想发现函数是凸函数,可以使用凸函数的三分做到 \(O(n\log n)\)……但是值域可能很大,三分的范围需要到 \(10^{15}\) 级别,大量运算的结果需要使用 __int128 存储,感觉时限 0.5 秒会比较极限呢!

但当时没想到拆绝对值…所以就直接写了三分,自己测了一组纯随机的极限数据考场机子跑了 0.4 秒,看起来还可以?这个时候大概过去了 30 分钟,于是把代码存了就开下一题了。

然后先开了 xor,发现并不是数据结构而是一个最优化题。位运算加最优化很可能是 Trie 上进行一些贪心,于是就开始思考一些 Trie 上的简单策略,例如怎么样去保证某一位是 1 这样子的贪心。

想着想着感觉贪心是有一些道理的,但是很多细节想不清楚,于是上了个厕所,把自己发现的 Observation 写在了纸上,先去阅读了 wormhole 的题面。

发现是个和置换相关的题!思考了两个排列的情况发现也比较复杂,并没有什么很干净的方法去刻画这些条件,所以权衡了一下还是回去想 xor

然后慢慢就发现了一些很有道理的结论:特殊操作只会用在 \(\oplus\) 操作后前 \(k\) 小的数用来增大全局 \(\min\)。想着想着慢慢觉得贪心的世界线会相对收束,开始考虑设计一个遍历到某个子树的参数。

然后这样的策略显然不是很好想清楚所有细节的,于是就对着所有大样例一个一个调,时间也过的飞快。最后其实自己也想不太清楚算法在干什么了,瞎做一通最后在 12:00 左右过掉了所有样例,端详了一下自己的复杂度大概是 \(O(nk)\),看起来能过?

过完样例之后其实还是又看了一遍自己的贪心策略啦……但是过了大样例就很自信了:这里看起来对了所以肯定对了!

于是剩下的时间就开始给 wormhole 拼暴力了。暴力还是比较好拼的:直接输出阶乘是 8 分,写一个 DFS 是 16 分,加起来一共有 24 分。

拼完暴力还剩 30 分钟左右,又在纸笔上调试了很多东西……最后还是空手而归了!

然后还剩 10 分钟的时候开始检查文件……

g++ wormhole.cpp -O2 -std=c++14 -static

没有问题。

g++ xor.cpp -O2 -std=c++14 -static

没有问题。

g++ wind.cpp -O2 -std=c++14 -static

一长串 CE 信息。

啊????

g++ wind.cpp -O2 -std=c++14 -static

仍旧是一长串 CE 信息。

g++ wind.cpp -O2 -Dlocal

编译通过。

啊????????

此时距离比赛结束只有大概 5 分钟了,血压一瞬间直接拉满。看了一眼发现是 abs 的问题:__int128 并没有合适的 abs 函数可以用。于是赶紧改改改,改完测了一下大概是过样例了……也来不及再造数据测速了,又确定了一下有没有加文操比赛就结束了。

出场觉得自己应该是打了个很标准的大众分 100+100+24=224,然后发现还是有一些最后也没能调完 xor 的同学,所以自己大概还有优势?

找海棠聊了聊稳住心态,觉得大概是问题不大,Day2 能正常发挥就很健康,仍然采取最大化总分的策略而不需要特别保守……?

一番打探后发现 xor 的大样例不满,写了严格 \(O(nk)\) 的同学都会比我快很多,大样例跑了 1.2 秒的我很可能会被卡常到 76 分,但是即便如此 100+76+24=200 的得分也足够我 Day2 有一个相对轻松的环境……?

晚饭前后,民间数据公布。

我的 wind 只有 90 分。虽然赛前对考场机,评测机,云斗机都有一定了解,但是我发现自己还是犯了一个很致命的错误:测速的数据卡满了 \(n\) 却没有卡满答案。三分在当前值不合法的时候需要额外计算下一个点的值,会存在 2 倍常数,也就是说考场测试出来的最慢点可能会达到 0.8 秒,这是无法通过的。

我的 xor 只有 64 分。因为 Day1 需要稳住心态,我没有检查代码中哪里的策略无法保证答案正确。但是如果按照一档分全过才算 AC 计算,我的最坏分数已经从 64 跌落到 52 甚至更低。

总分在一分钟之内已经跌落到了 90+52+24=166。伴随着一份又一份 \(O(nk^2)\) 快刀斩乱麻纷纷通过民间数据,气氛来到了冰点。

一波计算发现自己已经来到了校内第 3~4 名,省内 18~20 名,Day2 的形势一下子就悲观了起来……

然后心态就爆了。

于是晚上完全没心思在电脑前做任何事,索性就直接出门走了几圈。不断安抚着自己 Tomorrow will be fine,反复告诉自己今天的发挥其实还可以,明天好好打一定能翻回来。

最后和青鱼打了个电话,聊了聊自己现在的情况,收获了一些心态上的建议,于是还是在一个比较早的时间睡觉了。

真的睡的着吗……?

一天之内的大起大落反复给自己非常糟糕的心理暗示,All or Nothing 的想法也会让自己第二天的心理压力不断增大。

不知过了多久,疲惫的本能才让自己入睡。

Day 2

肾上腺素还在发挥!起床的时候也不算太困!贪婪地留恋着杭师大的风景——毕竟肯定是 OI 旅程最后一次再来了……

坐进考场。极力掩饰着自己的紧张和焦虑……当然做不到啦。

解包,大样例没有前一天多,但从大小来看也还算比较健康,存在一个输入和输出大小相近的题……可能是数据结构?

开题,maze 又是一个树上最优化的题,看起来非常像贪心。第一天的 PTSD 让我直接 skip 掉了这个题,选择继续向后开。timeline 是个看起来非常 \(O(3^n\text{poly}(n))\) 的状压数数题,和 DAG 拓扑序计数有关。

于是就带着迷之自信开始做 timeline,把自己会所有状压数数的套路全代了一遍……最后代了个 \(O(4^nn^2)\),几乎没有分,大概是 25 分吧(伏笔)。

30 分钟后意识到还是得顺序开题,不能对自己太自信。想了一想感觉有一些比较合理的做法,比如一位一位贪心。

贪心的过程大概就是找到第一个数最大可以取到多少,然后递归。直接求精确值比较困难,所以再考虑二分一下转 0/1 问题,这样子就简单很多了,直接做大概是 \(O(n^2\log n)\),上一棵可持久化线段树去优化 0/1 问题的求解就是 \(O(n\log^2n)\) 的了。

但是这个题还是有一些细节的,比如先递归某一棵子树的时候要考虑给另一棵子树留出必要的资源后,再把剩下的资源全部投进去。写完还是 WA 样例了好几次,最后过了之后又检查了好几遍贪心正确性和多测清空才开下一题。

这个时候大概是 10:00,开 timeline 之后还是比较鱼鱼的,因为发现 \(O(4^nn^2)\) 已经死路一条了,也没有什么可以 Subset Convolution 去优化的地方。

于是果断先看看 sleep 能不能拿一些可观的分数,因为这个题看起来很像数据结构题!

这题在讲什么?

样例解释在说什么?

爆!这个时候感觉自己 Almost 没希望了。但是 OI 是个你不想写也得写,于是反复读 D1T3 题面发现了一个事实:两个人比赛随机报一个正整数比大小,没有人有必胜策略;但是如果你已知对方报了多少,你就有必胜策略。

于是一切慢慢清晰起来了:第一次报数定胜负。顺着这条思路想了一些时间之后,sleep 终于变成了一个数据结构题。A 性质和 C 性质都指向了楼房重建 Trick,但是树剖上做楼房重建的动态 DP 代码量非常大,所以最后打完了简单的 B 性质和 D 性质之后就暂时扔掉了已经拿到 56 分的部分。

做到这里大概还有 1 小时,于是考虑再回去思考 timeline 的一些更深入的性质,结果非常糟糕地颗粒无收。

还有 30 分钟的时候意识到即使现在想出来也来不及了,果断回去拼暴力。\(k=0\) 就是简单的拓扑序计数,拼拼拼!\(m=0\) 答案肯定是 \(1\),拼拼拼!\(m=n-1\) 呢……咋办,不会拼了啊!

然后距离比赛越接近脑子就越乱,在还有 10 分钟的时候放弃了性质 A 开始拼性质 B,然后发现还是拼不对!拼不对的同时自然也没有时间去测试前两个包对应的部分分,也就是说我的整个 timeline 根本没有测试每个特判是否对应了自己可以处理的数据范围。最后 2 分钟终于发现自己哪里假了,想了一想改了之后只能过 B 不能过 A,哎呀没办法改改改,发现过编译了就直接复制到选手目录交上去。

时钟指向 13 点,比赛结束了。

结束了?

我的大脑里一片空白。

满打满算自己的分数只有 100+45+56=201。我明白 45 分绝对不是 timeline 可以接受的分数,而 56 分也肯定是大多数人读完 sleep 之后可以拿到的分数。

自己还有机会吗?

出考场听到各式各样的爆搜又轻松地通过了 timeline 的所有大样例,而且都能证明自己的分数下限是 60。即使自己的竞争对手都没有开 sleep 并且自己只能通过编译的代码能正确地执行所有预料的功能,拉回的分数可以弥补这一切的差距吗?

我只能苦笑。

六年的算法竞赛生涯涌上心头。这是一份可以被接受的答卷吗?是可以作为你生涯最后一场比赛的答卷吗?

我不知道。

失望与绝望与疲倦一并袭来,除了痛哭以外我什么都做不了啊。

或许是实在太过沉重,身边的人在听到这条消息之后不少甚至也会被情绪冲垮,我只能在悲伤的旋涡里越陷越深。

自己一次又一次辜负着身边的人的期望。自己又能做到些什么,又能改变些什么呢。

幻想着退役后深不可测的未来,双目无神的我在阳光下漫无目的地行走着。

下午陆续听到了一些民间数据里大家 mazetimeline 都有不少挂分的消息……自己还有机会吗?可是万一自己也是挂分的一员呢?应不应该现在去揭晓结果呢?

等待只会让自己越来越焦虑。好吧。或许还是要面对这一切呢。但这次,我需要你的帮助呢。

下楼买了一罐 Heineken 几乎一饮而尽,要来代码,解压缩,删掉文件操作,复制,提交。

我最后还是选择先交最不报希望的 timeline。永恒般的刹那过后……

45 Runtime Error。

呐,只是第一关啊。后面还有两次呢,可是已经根本控制不了握着鼠标的手了啊。

100 Accepted,68 Wrong Answer。

我做到了……?

打开群汇报了 sleep 数据错了之后,我开始怒吼着疯狂捶打面前的墙壁。

根本感不到疼痛啊。即使再用力也感觉不到。不会是梦吧。

民间的榜我是 Rank 9,完全不挂分就是 Rank 3,距离 Rank 16 大概是 xor 可以挂到 Almost 没有分的程度……虽然不是百分之百,但自己几乎已经锁定了想要拿到的位置。

果然还是该相信奇迹啊。

Day 3

看了一眼同学的成绩,zmx 是一个稳健的队内,upd 是一个需要抽奖的队内,抽到更低和更高都有可能。cml 和 zmf 是一个能再抽奖一下的队外,mer 是队外确定。

自己就算挂分了应该也是队外第一,吃 C 的概率不小……那先开香槟!

舞萌。

Day 4

舞萌。

Day 5

听说要出正式数据了,失眠。

Day 6

出正式数据了,仍然是激动的心颤抖的手。

复制数据,直接用 CPEditor 打开。

前几个点一定不能挂……没有按下 F11 的勇气,索性按了 F9 之后一个一个测。

前 13 个点都没问题……那么一鼓作气吧,F11!

最后直接冲过去了 88 分。悬着的心彻底放了下来。

在洛谷测完了所有的题,100+88+24+100+45+56。

赶紧把消息告诉所有人,这次,是我的胜利呢!

中午左右开了终榜,自己最后直接翻到了 ZJ Rank 3,前面是衢二的两个外星人,后面是小赢 1 分的笋老师。

官方榜和云斗榜没有区别,应该不会再有申诉了。

真的是 A 队吗。自己这么多年都不敢想象的,高于 NOI Au 的目标,就要在这么 Drama 的一场比赛里实现了吗。

posted @ 2024-03-07 16:34  dXqwq  阅读(217)  评论(3编辑  收藏  举报