「杂记」CSP 2021 简记

CSP-S 2021 简记

初赛

前一天晚上正好碰到了难得的晚上放假的机会,所以向老师请假回家复习了一下笔试内容。

但是看起来所有人都没有想到我会回家,家里没有准备😅

简单看了一下考点和真题,只觉得 NOI 的笔试要简单好多呀😢。


初赛当日。拿到卷子先冷静下来,选择题做得比较慢,因为去年在这一块有点拉,尽量不要再出问题。

根据经验,阅读理解应该不算简单,所以先开了完形......为什么初赛就会考 Four-Russians?暗示复赛很可能有稀奇古怪的算法

虽然之前只是听说过这个算法怎么做,从来没有写过,但是题目解释得非常精细且到位,按照它的思路选下来就好了,感觉没什么障碍。

然后就是最害怕的阅读理解。第一个上来就写满了我看不懂的数学式子,但是通过找输入数据个数和边界特判加上选项提示最终成功确定了它求的是球体体积交。剩下的就好办了,直接把输入数据输入到程序中手算就好了。

第二个......记不得了。第三个比较有意思,一上来把人给看麻了,冷静了 5min 才发现这就是一个重新划分二进制位的转码算法,本质就是大模拟。之后......问题就复杂多了,因为我根本不记得 'a''0' 的 ASCII 码,我只能乱猜,于是就出现了 'a'='A'+26,'0'='a'+26 这样的新式编码形式。反正运气好,虽然不知道,蒙也蒙对了

最后检查了一下个人信息,交卷,感觉今年发挥得要稳健一些,算是开了个好头。

复赛

好家伙,从星期三开始就觉得今天是星期四,星期四就觉得该试机,星期五觉得该考试,星期六觉得“怎么考完了?”

试机日

从早上开始就觉得比较兴奋,试机总觉得像是过节一样的事情。正式的事情大概都有个 Prelude。

结果试机的时候发现考场的电脑问题不小。今年配备了 9.3.0 的 g++ 不错,但是机子适配问题比较大,部分机房还是 32 位机器,运行不了新版的编译器。此外,虽然配备了 Code::Blocks 的 20.03 的安装包,但是安装好后显示缺少动态链接库......麻了,考前一周都在使用它,现在居然用不了。

可选的编辑器只有 Dev-C++ 和 VSCode,一个适应不了新版的 gdb,另一个纯粹是编辑器。虽然我早就想尝试 VSCode 了,但是经过我审慎的思考,我觉得命令行编译早就用熟了,直接用 VSCode 就好了。于是晚上回机房速成 VSCode,效率挺高,学会配置 Code Snippet 就差不多得了。

晚上还研究了一下 Smith's Determinant,但是觉得 CSP 多半不会考,毕竟考纲里面没有行列式。胡说,CSP 和 NOIP 有什么关系?!

考试日

早上复习犯过的错误和考试策略,以及继续熟悉 VSCode。然后突然发现有人关注了我的 blog,好耶

顺便还思考了一下编辑器的使用,最终决定发挥 Dev 的余热,让它干调试器的活计。对于 C,Dev 的调试功能还算相当强大的

中午出去吃饭之前,把比赛的检查事项全部列了一遍,感觉照着做应该就比较稳当。吃完饭之后,就去打球,被杀穿了😭

下午去考场,中途出了亿点点问题,不过最终问题解决了,准时到达了考场。波折一番,反而不太紧张了😆。

旁边的 Tiw 一直在被家长问“今年怎么还要参加比赛”,祂自己也想不明白,我只能安慰,这是多给两次 AK 的机会


进考场了,键盘有一点不习惯,Backspace 长得有点萎缩,而 Enter 发育得太好,导致我经常按错键。

稀奇的是,监考老师居然并不宣布“考试开始”,让我在发密码到 14:30 的几分钟空隙中觉得颇为无所适从。

接下来是紧张刺激的读题环节

  • T1:这是什么东西,我是不是该退役了;
  • T2:我怎么读不懂题;
  • T3:这会不会是 ARC 的原题;
  • T4:怎么会有网络流;
  • 总结:今年题目太诡异,感觉没有签到题,让我想就地退役

读完题,在脑子里面稍微搜索一下已有的比赛经验,怀疑这会是骗分场;想到这一点也就放松了许多,毕竟有个策略总比盲目做题好。

最终决定顺序开题,因为实际上 T1 是我真正能够一开始就读懂题面的题目。

但是这个 T1 没有那么简单。反应了大概 2min 之后,隐隐约约有了一个想法,觉得这个答案应该只和两种航班各自在某一时刻的降落飞机的数量的最大值相关,然后随便写一下就废掉了它。再冷静了一下,突然意识到每架飞机的停靠状态关于廊桥数量是单调的,也即只有一个变化点,问题简单了不少。再在草稿纸上画了几下,发现每架飞机的停靠状态可以 balabala 二分找出来。反正我也没有仔细思考正确性,感觉应该是对的,于是开始码码码,T1 居然写了 140 行。写完直接过掉了三个小样例,咦怎么只有小样例?保险起见还是写了对拍,毕竟思路有点 intuitive,最好是数据确认一下。幸好检查了一下输出,不然可能一直用 \(n\) 比较大的随机数据,输出全是 \(m_1+m_2\)

T1 写了有将近 60 min,不算快,但也在估计内。写完了 T1,心里比较有底,决定先开一下 T2。仔细阅读题面才发现题目没有想象中那么绕,也不算太复杂,问题主要是理解错了 \(S\) 的内容——原来它只会包含 *。之后心里大概有了线性 DP 和区间 DP 两种思路。先走了第一条路,发现线性 DP 不方便处理括号匹配的情况,只得作罢;再尝试第二条路,发现区间 DP 其实完全可以按照题目描述来写转移,那么这个 T2 也就比较有道理了。

先写下一个 \(O(n^3k)\) 的暴力 DP,写出来意料之中地发现过不了样例 2。答案偏大,多半是算重了,再一想,多半是 AS?B 的情况算重了,补一个状态让 B 必须被括号包住就好了,修完锅之后意料之外地发现还是过不了样例 2,只能冷静打开 Dev,跑几步就发现了问题所在,最终成功通过了所有样例;开始优化流程,只需要把 AS?B 的瓶颈用前缀和优化掉就好了,调了几个错之后通过了所有样例,对拍也比较顺利。打开 -O2 居然可以让运行时间缩减到 1/10,神奇

做完 T2 之后大概过去了 2h,可能还是有点慢了。本来是想在后面两道题目上面骗一点分的。但是一拿到 T3,我先读错了两遍题,高兴地发现这不是原题;而后简单地分析了一个基本上毫无用处的性质,去上个厕所想明白了思路,坐到电脑前发现复杂度是线性的,最后后......就写了个疑似可过的代码,甚至还通过了两组小样例,极限数据和小数据对拍。仔细阅读了代码之后觉得问题不太大,甚至让我怀疑这道题是不是签到题。可惜的是时间又过去了 1h 10min,只有 30 min 写个 T4 的网络流暴力了,这和我的预期相差还挺大的

调试 T4 的时候,拿着样例画了几笔,突然发现这可能是平面图最小割的题目,可惜时间已经来不及了,写完暴力过完样例就开始检查。

保险起见,我在 -std=c++98/11/14 状态下全部编译了一遍,而后再打开 -Wall -Wextra-std=c++14 状态下又编译了一遍,全部没有异常报告才安心。而后是测样例和极限数据、检查空间、搜索可能翻车的变量名称......做完这一些差不多只剩几分钟,于是关闭了所有窗口,等着离开考场。


出来发现并不是每个人都发挥得比较好。🐴🐟😒巨佬遇到了策略问题,Tiw 说祂没有写完 T4,AK 失败,我又只能安慰祂,NOIP 还有机会。和同学们交流了一下 T1,感觉自己的思路应该没什么问题,只怕到时候写错点什么就不好玩了。

整体来说,这次考得比较稳健,没有出现心态问题,检查还算比较周全,算是考出了正常的水平吧。


晚上啥也没干,就把代码全部放到 Ubuntu 20.03 上面编译了一遍,没有出错,非常安心。

posted @ 2021-10-24 11:39  crashed  阅读(188)  评论(0编辑  收藏  举报