CSP2024 游记+总结

nb_jzy

2024-10-27 19:04:55

Life & Travel

Day -114514

初赛怎么分数线这么高,还好没有弱智,过了。

Day -1

去 BZ 试机,发现头文件对于程序运行速度影响很大。当使用不同头文件时,输出 10^6 个数的速度差距十分的大。

cout 关同步 printf+cstdio/万能头 printf+stdio.h
0.3s 1.9s 0.3s

Day 0

J 组

7:40\sim 7:50

王老师看到 jr_zch 并对一位学弟说道:“他们上午都要 AK 的,是学长。”

然后 zch 就又㕛叒立下了 flag :“我要 2h AK”。

7:50\sim 8:15

进了 BZ,发现 NY 的学弟学妹们都被组织好站在台阶上,我们站在一边,有一点不合群?然后我们的启蒙老师李老师就问道:“你们不站过来吗?”。然后我们赶紧“融入”到了大集体中。

接下来就是老师们的鼓励环节,没想到黄老师也在。

8:15\sim 8:30

进了考场,发现大家都坐在附近,所以很安静。然后就例行检查了一下 D 盘,看了一下大样例的名称。发现有一道题只有一个大样例,感觉有可能是找规律或者是神必结论题,有点紧张。

8:30\sim 8:40

本来想直接倒序开题,但是还是习惯性的先通读了一遍全文,然后发现 B 题好像有点问题?哦,是我看错题了。C 题出原题?当时我还过掉了?这不直接起飞?然后 D 题看到轮数很少,即刻想出了 \mathcal O(r\times L^2)

8:40\sim 9:00

为了求稳,慢悠悠地打完了前两题代码。对拍?这个需要对拍?这不直接是暴力了吗?

9:00\sim 9:30

写了一下 C 题,写的也很慢,中途还多次试了一些数据,检查无误后就去上厕所了。

9:30\sim 9:54

回来看这个 D 题,一直在考虑将原序列重排一下然后 dp,但是好像不是很能满足一些限制。于是就在原来的 dp 上想了一会儿,然后发现自己是弱智。不能从自己转移过来这一点就直接记录一下当前状态能有几个位置转移过来/能由哪个唯一位置转移过来不就行了。

9:53\sim 10:30

又是慢悠悠地写起了代码,然后发现过不了大样例。然后就调试了一些细节就过了大样例。但是发现要跑 1.9s !?

10:30\sim 10:45

尝试进行卡常,于是卡进 1.7s 后就摆了。

10:45\sim 12:00

为什么监考老师一直在走动?我玩个 surf 都心惊胆战,前前后后就只玩了 5min,然后就一直检查文件名之类的东西(不知道为什么看了很多遍)。

12:00\sim 12:20

老师说了今年收代码会有变动,但是不知道为什么这么的慢。

然后出来基本上都阿珂了,就是都在讨论 D 题的常数。zch 没有达成 flag,花了2个小时多一点,%%%。

S 组

中午没怎么睡着,但是前一天睡了挺久,干了一杯咖啡就走了。然后还带了一瓶红牛。

14:15\sim 14:30

进了考场,发现被 BZ 包围了,右边的人很吵,一直在跟我左边的人说话,有点烦,关键是他身上还有一股味儿!?本来想跟监考老师反馈,但是老师提醒后总算安静一些了。

14:30\sim 14:40

正式比赛,直接开启我平常的策略包,第一条铁打的通读全文,然后 A 题觉得不是很难。B 题考了加速度?要注意精度了。C 题染色?贡献看起来不是很难算的样子。D 题怎么依托啊?

14:40\sim 15:00

A 题,发现过不了样例,然后发现读错题目了,每个人都需要打一场。然后猜想一个贪心,即每个人肯定被当前还没有打过人的最小的人打,而这个看上去就十分的正确啊。然后代码就十分的短,仔细检查后看下一题了。

15:00\sim 15:50

观察到每辆车超速的路段肯定是一段区间,然后第一问就乱做了,而第二问就是求最少用多少个点可以覆盖本来可以被覆盖的区间。这几周练的贪心告诉我这是个缝合。

然后考虑如何在不爆精度的情况下求出他的超速区间呢?

我直接先求第一问,简单推导一下他的速度达到 V 的路程,然后写完后发现第一列有几个大样例没过。然后发现开区间比较烦,需要考虑一下刚好在整点的情况。

然后第二问就是简单的贪心,于是发现大样例又过不了。

然后没清空,那没事儿了。感觉大样例很有强度,没写对拍。

15:50\sim 16:27

C 题,只有两种颜色,所以是一个类似于区间划分的形式,而这就十分的 dp。然后再考虑拆贡献,发现一段颜色中间的贡献可以预处理,两端的贡献呢?好像需要知道上上个端点?但这就成了 \mathcal O(n^3),不太能优化啊。然后想了一会儿说出了几个字:费用(贡献)提前计算,我直接转移的时候算一下 i+1 的贡献不就行了吗?

然后很快打了一个 \mathcal O(n^2) 的暴力 dp。发现这个随便优化,于是采用了常数较小的树状数组。检查了一下清空后去上了个厕所。

16:30\sim 17:45

一直思考 D 题,发现是一棵二叉树,而前 \frac{c_i}{2} 个人的赢家肯定是确定的,可是另外一边怎么办呢。经过长时间思考后只想到了能够维护每个点最多可以必赢到第几轮,但是之后呢?一直都没有突破性的进展。

17:45\sim 18:20

然后想着拿点暴力,就只打了 n,m\le 8 和 A 性质。

18:20\sim 18:30

例行检查,感觉到了前三题都比较简单,认为自己的分不能算高分(但是当时已经比较满意了)

18:30\sim 18:50

又来收代码,听到旁边 BZ 都是300+,D 题还有会单 \log 的,于是我安慰自己说他们肯定是高中生。但是右边那个人一直在问其他同学,BZ 的大部分都上 300 了!?

18:50\sim 19:40

和老爸出去吃饭,发现人好多,于是吃了一个中餐就回去了。

19:40\sim 22:00

颓,然后被强制要求开始做卷子了。

Day +1

突然发现 SB 题没处理 0 的边界!!!完了啊,不知道要挂多少,是不是上不了 300pts 了!?

不过重现了一遍代码,锣鼓数据过了,想了想发现出错的情况限制十分的多,概率也十分的小,希望运气好一点吧。

总结

还是对于前几周一来总结的策略有些运用吧。水平上升也比较明显。(点名表扬贪心和 dp 能力)

但是暴露出来的问题也有很多:

未判边界

出现了一个很久都没有出现过的一个问题:边界条件

在如此关键的时刻出现了,并且很有可能葬送整场比赛,虽然抱着侥幸心理,认为不会被卡。但是如果真的被卡了,后果十分严重。

经常在读其他学长的游记时发现他们会“手捏几组小样例”,自己为什么不将这些好的地方借鉴呢?

所以以后考试一定记得要想尽方法卡掉自己的代码,特别是注意好一些边界的处理

做法可优化

这周的总结也提到过,有时候 TLE 并不是卡常,而是有更优的做法。

S 组的 C 题,转移全都是加法和取 \max,根本不需要用数据结构维护,直接记录一下单点和全局最大值就行了(因为答案不可能更劣),我还非得用树状数组带 \log 的做法,虽然跑得比较快,但无疑是增加了 TLE 的风险。

大把的时间利用不充分

当很快完成前三题后,我在最后两个小时的效率是十分低下的,可能是平常没有这么多时间给我想 D 题(因为前三题能做出来的场真的屈指可数),所以我自认为 D 题是十分困难的。

但实际上顺着我意识到的性质,似乎可以得到一个 \mathcal O(n^2) 的做法,但我却完全忽略了他。这就是一个很大的忌讳D 题一般都需要进行层层的考虑和优化,我只是空想不细想没有一个确定性的做法,这样是怎么都不可能想出个结果。

但是,我还是应该庆幸暴露出来的问题,过去的都是篇章,都是历史,而我们要创造的,是根据历史进化的未来。

Day +9

CCF 你个小可爱,我爱死你了。

好消息是没有瓜分,全部拿到了理论上界。

还有就是 zch 他真的也 AK 了,证明了王老师的预言。

S 组分不高不低,不知道什么结果。