CSP 2024 游记

lizihan250

2024-10-29 20:29:03

Life & Travel

前传

初赛 2024.9.21

走进考场,看到许多可爱的小朋友,我下意识检查了一下组别。

初中同学一个都找不到了。过去的朋友们全都 AFO 了。

今年参赛的人格外的多。加上听说上午普及组卷很水,有点担心自己成为分母。

开始考试。10 分钟切完选择题(然后四元环未判重喜提 28pts)。

阅读程序 1 是个很好理解的快排。无论如何,这道题让我放心了一些:试卷应该不会过于简单。

阅读程序 2 是个很有意思的题。稍微分析一下,得出的题意是:“给定一个长度为 n0-1 字符串,从中选出 n 个(一种允许前导 0,另外一种不允许),求所有选法得到的字符串视为二进制数后,它们的和是多少。”推导过程中用到了 NOIP 2018 的老熟人——二项式定理,当场差点笑出来。

做完阅读程序 2,我的考试时间仅剩 30min。面对时间紧张,我的思维一下陷入混沌。我决定先把通常容易拿分的程序填空完成。当时我未能完全看懂程序就匆忙下笔,结果作答结果为“BBAAA BABAA”,也未能在考场上欣赏“9A”大作。再回去看阅读程序 3,我完全看不懂,在半读半猜中完成作答。

成绩出来后,我得知阅读程序 1,2 全做对了,阅读程序 3 也只扣了 5.5pts。总分 83.5pts,算是一个还可以的成绩。

备战复赛

国庆假期

给自己出的题目配置了测试点。 某次模拟赛,B 题给了好几档部分分。尝试分类讨论骗分。分类讨论结束没 return 0;,写的还是 if,部分分交集不为空,在第二行读取到选手答案。

Day -16

发现自己出的题是某题弱化版。于是重新出了一题。

Day -13

打洛谷 2024 年 SCP-S 非专业级收容能力测试提高级第二轮。\ T1 用 set 乱搞过了。然后摸了一小时鱼

看了看后面的题,T2 完全不会,T3 完全不会,T4 似乎比较好写部分分。为了方便,我使用文件输入输出调试代码。

没多久就写完了 32pts 暴力,接着向特殊性质 B 进军,不幸写挂。距离结束还有约 25min 时,我提交了代码。剩下的时间试图写出 T2 暴力,未果。

评测结果中,我 D 题一分没拿。回去检查代码,发现是我忘记注释文件输入输出了。但愿 CSP 时不要反过来。

Day -8

纸上写线段树 + DFS 序,上机测试后准确率还不错。(纸上写 3.4KB 的代码,我真是太抽象了~)

Day -5

突发奇想要写一下结构体,我一整年的噩梦。\ 事实是这题比我想象中的简单多了,1.5h 调好,一遍过。\ 自信心爆棚,(莫名希望 CSP 考大模拟)。

Day -4

写棵线段树热身。\ A 了括号序列。区间 DP 真好玩。\ A 了消消乐。map 真厉害。\ 当年考场上用 char 作数组下标。50pts \to 25pts。绷不住了。

Day -3

写棵线段树热身,不幸写挂,调试 3.5h。前 2 天积累的信心全没了。\ 把下方标记写错我也是奇才。

Day -2

写棵线段树热身。用矩阵乘法维护两种操作,常数太大,TLE 了。\ A 了回文。一开始数组没开到 2n 喜提 96pts。\ AK 了 CSP2021-J2(梦开始的地方)。

Day -1

换了种写法把前一天的线段树题 A 了。\ 把会的模板(除线段树)全写了一遍。调的时间最长的竟然是 LCA。\ 又写了一遍 Why Did the Cow Cross the Road II P。还记得初中时,我们学校的教练把这题放在普及组模拟赛中。重写这题时不慎把 i,j 写错。但愿在考场上不要用错变量。

比赛日——赛前

看起来我只是又一次踏入 CSP 的考场,可谁又知道这一年间我都经历了些什么呢?

听着 PRAGMATISM -RESURRECTION- 前往学校。AFO,再到回归,或许在 OI 上这也是一种复活吧。

大致总结了一下近期犯过的逆天错误,写了份专栏。赛后想来,应该在校内 OJ 上也放一份的。

吃完中饭和同学一起前往赛场。同学们纷纷发朋友圈表示 AK IOI。车上群英荟萃,有玩原神的,玩崩坏:星穹铁道的,玩明日方舟的,玩 Phigros 的,玩 CYTUS II 的(就是我),玩火影忍者的,玩狂野飙车的,玩部落冲突:皇室战争的……有人“中二”病犯了,唱 TECHNOPOLIS 2085。车上充满了快活的空气。

比赛日——赛时

准备阶段

按照计划,我进考场后先睡了一小会儿,但其实我完全睡不着。\ 监考老师下令解压压缩包。\ 公布 PDF 密码。比赛正式开始。

审题阶段

打开 PDF,瞄了眼 T1,发现比去年 T1 还幽默,1min 脑 A 了。

再看看 T2。T2 考了匀加速直线运动。我一开始以为这会是大模拟,但看完题目后我发现并不是。稍稍想一想,容易发现,对于 a \ge 0 的车,越远有可能被判为超速;对于 a < 0 的车,越近有可能被判为超速。这样用二分可以做第 1 问。第 2 问就成了一道线段选点覆盖题,大概率可以贪心。

此时机房里已经响起了一片片敲键盘声,但我没有理会,继续看后两题。

T3 题面很简洁,读懂了之后容易想到一个朴素的 DP:记 dp_{i,j} 为只考虑前 i 个数,最后的与 i 颜色不同的数为 j,求得分最大值。这样有 50pts。这样还能压掉第一维,看起来很有前途。

T4 看到题面就不想做了。一开始以为是大模拟,但它数据规模又特别大。直接放弃思考了。

此时离考试开始已经过去了 15min

做题阶段

打开了熟悉的 VS Code,点开之后,我直接呆住了:唉你怎么是黑色的啊?

由于我在学校机房中用的 VS Code 都是明亮主题的,在黑暗主题下我略有不适。又因为我之前没有亲自配置过 VS Code,操作不熟悉,我花了约 10min 调整试图。

T1 duel

我的第一反应是让次小的吃最小的,第三小吃最小的,……,以此类推,写出了如下式子:

sum=max(0,sum-nums[i]);
sum+=nums[i];

写出来后,我突然意识到,这不就是 sum=max(nums[i],sum); 吗?提高组第一题已经开始考求众数了,我们的 CSP 正在蒸蒸日上啊!

调完这题,大约距离考试开始已过去了 40min

T2 detect

T2 写代码前,我先计算了计算过程的数据大小上限——不超过 2 \times 10^9 + 10^6,不会爆 int

思考第二问怎么做。经过一小会儿的思考,我感觉和“求不交线段数最大值”类似,好像 hack 不掉。于是开始编写代码。

编写一大堆二分是一个稍微有些繁琐的事情。分清 n,m 也是一个坑点。我一开始因为二分边界条件写错,调了半天过不了样例 4。经过调试后,也顺利通过了所有样例。

样例 5 我的程序跑了 1.6s,保险起见,我写了快读。

此时距考试开始已经过去了 1h40min

T3 color

由于对状压技术不够自信,我先写了 50pts 的状压,准备接下来再进一步优化。

接着,我尝试在终端中使用 color 运行 color.exe。然而,事实上,color 是一个用于改变终端颜色的系统指令。这也意味着我无法正常运行程序。当时我用了不少时间检查代码中是否有运行错误,但并没有检查出来;编译选项开了 -Wall,也没有报错。知道我打开 Dev-cpp,发现能编译运行,我才突然意识到指令 color 有其它的含义,于是用指令 color.exe 运行程序。

这道题的转移与数值密切相关,像之前的定义方式其实并不好转移。于是我做出了一个决定:重新设计动态规划方式,令 cl_{nums_i} = dp_i。这样可以整体转移,时间复杂度为 O(T \times R_{max}),可以通过此题。

这题的代码比 T2 好写很多,没多久就写完了。测试大样例也通过了。这使得我兴奋而紧张起来。

此时离比赛开始已经过去了 2h50min,离比赛结束仅剩 1h10min。比赛进入垃圾时间。

T4 Arena

再次看到这道题,我内心依然对它十分拒绝。但为了拿到 7 级勾,我不得不鼓起勇气写它。

读懂题目花了我 15min,稍微想了一下,发现想不出任何做法,于是决定写特殊性质 A,然后写挂。为了求稳,我放弃了这题的编写,结束做题阶段。

此时离比赛结束还剩 10min

检查阶段

由于时间匆忙,我只进行了文件操作、数组越界、数据大小超限检查,并确认前三题能正常通过大样例,并没有进行静态查错

没检查出任何错误,我填完了字节数确认表,再确认文件位置没放错,考试也就结束了。

比赛日——赛后

对部分同学进行了采访,他们的部分发言如下:

“啊?T1 是求众数?”

“T2 局部变量没初始化调了 2h。”

“我觉得 T3 是黄题。”(这名同学场切 T3。)“我觉得是橙蓝黄黑。”(但他没做出 T2。)

“我在 T3 和 T4 中选择了 T4。事实证明,这是个错误的选择。”

赛后

Day +1

其实我挺不想重构代码的,因为我懒我不想打击我的自信心。然而在周围氛围的推动下,我还是打开了自测。

T1 很快就写出来了,没有问题;T3 也没有什么问题。T2 调完,提交……唉,怎么只有 30pts

我第一反应是我贪心假了,连忙去翻讨论区、题解。讨论区没有 30pts 的“警示后人”,题解中也有右端点排序求解的。我又仔细检查了我的代码,终于发现如下问题:在加速度大于等于 0 的部分,添加线段时,我写了如下代码:

tmp++;
seg[tmp].s=nw;
seg[tmp].t=n; // 应为 seg[tmp].t=m;

这份代码通过了所有大样例,但只能稳定通过测试点 7, 8,洛谷自测 30pts

当时我还是有些绝望的(若 300pts \to 220pts,可能导致 Au \to Ag),于是那天晚上思绪混沌,打字时打出不少错别字,scanf 内的标识符写错,三角函数的和差角公式默不对……

这一天在迷茫中结束。

Day +2

CSP 过去了,但生活还要继续。我说服自己不为 CSP 成绩而焦虑:

  1. 假设我写 mn 的几率相等,那我的期望得分就是 260pts,还是能拿一等的;
  2. 再过 15 天期中考,过 31 天 NOIP,我应把精力放在后面的议程上,而非浪费时间。

结果呢?我看了看上一届 OI 队的 NOIP 游记,开始为 NOIP 焦虑了。

Day +9

出分日。心里不断祈祷 T2 不要挂分。\ 进入系统,点开成绩查询,在进入系统的那一刻,我终于如愿以偿的看到我的 T2 没挂……

然后 T3 挂了。65pts

唉?不是??为什么啊???

对了一下部分分范围,不出意外的话就是 A_i \le 10^6 那两档挂了。估计是基于数值的 dp 数组开太小了。令人忍俊不禁。

Day +10

拿到代码。发现并不是数组开小了,而是初始化范围太小了,如下所示:

const int Maxp=1000000;
//do something
for(int i=1;i<=n;i++) // 应为 Maxp
{
    cl[i]=-1e18;
}

挂了一些分,有些不甘,不过还好数据水,没挂多少分。应该一等问题不会太大,说不定有机会拿 7 级勾。

结语

2024 年的 CSP 就告一段落了。这是我 OI 生涯第 4 次参加 CSP。

还记得小学开始懵懂无知的学 OI,初一终日颓废,初二发奋图强,初三心有余而力不足,曾经暂时 "AFO" 过一段时间……

然后就是今年,几乎不顾一切的在 OI 的道路上狂奔。重来的机会让我对 OI 更加珍视,让我意识到,于我而言,OI 不仅是一种竞赛,一种爱好,更是我的过去,我的现在,以及有可能的——我的未来。

审视从暑假重拾 OI,到现在,支持着我不断思考,不断研究,在被各种错误整的哭笑不得却还不停调试代码的,一方面是我对 OI 的热爱,另一方面也是对我的过去的一个承诺。或许我有千万个放弃、颓废的理由,但既然已经有了第二次机会,我就不得不好好珍惜。

再说回这次比赛,很多时候,决定拿不拿奖、拿几等奖的可能不一定是能不能做出最难的那道题,而是有没有足够强的代码能力、有没有足够沉稳的心态以及有没有“小错误”。我不是什么大佬,不可能在今年的考场上把 T4 做出来,然而,在赛后复盘的时候,我才发现,40pts 的部分分做法其实不是很难想。如果在考场上我更沉稳的阅读题干,冷静思考,其实是完全能写出来的。还有 T3 的变量用错、以及赛后 T2 的变量用错,这些都是相当不应该的,也险些导致我再一次与一等失之交臂。这些问题都值得我仔细反思,在后续的赛事中如何避免失误。

后续就是 NOIP,有机会的话说不定还能参加更高等级的赛事。在这里也祝各位看到这里的读者,以及我自己,rp++,拿到自己理想的成绩,在 OI 的道路上越走越远。

“我,并不后悔。”