2021CSP-S游记
从国庆过后就开始停课,确实面对的压力和挑战很大。
这段时间真的就是完全没有去想文化课那边的事。
越接近考试时间,模拟赛就越密集,最近大家都在互测。
蛮清楚自己的水平的,而且偶尔还是能考得不错,但是因为一些常见错误爆分的情况也不少。
在考试前一天晚上 10:4010:4010:40 就早早上床,直接睡了个爽。
下午试机,我那个 555 机房配置超级差,323232 位不说,VScode/MinGW9.3.0\text{VScode}/\text{MinGW9.3.0}VScode/MinGW9.3.0 都用不了,虽然老师说会去交涉,但也有可能因为各种因素就这样了。所以还是蛮担心的。
考试当天中午也放的挺早,老实说下午我的状态至少不是迷迷糊糊的那种。
但是之前模拟赛大部分都是早上,后面才改成下午考,我能很明显感受到自己早上的思维状态要优于下午的,虽然我也不知道为啥。
因此考试的时候还是有点点没把握的。
心里挺矛盾的,不想再像上次 2h2h2h 做大模拟,又不想第一题都想不出来。
最后——怀着模拟赛就像平时一样打的心,我进入了考场。
考试开始,我先花了十分钟左右通读了一遍题目,第四题晃晃就过了(因为我清楚自己不一定能做到第四题)。
最有感觉的应该算是第二题了,但是我还是先从第一题开始的,因为我觉得第一题应该是签到类型的吧,认真想想就出来了。。。然而——
T1
再次细读了一遍题目,明白大意后,暴力的 40′40'40′ 就出来的:枚举国内机场的廊桥数量,然后模拟一遍。
但是我还没忙着打上去。
接着就是想正解,很明显我应该是要优化这个模拟过程的,嗯?有点贪心的意思了。
我的想法是如何从 i−1i-1i−1 个转移到 iii 个,的确没想到用桶来装廊桥,所以就卡住了。
到最后我怀疑是不是这个思路有问题,我就开始手玩样例,自己也弄了几组小样例。
好巧不巧这些小样例都是有凸性的,我就以为这是道三分的题目。
迅速就码完了,连大样例也过了。
耗时四十分钟左右。
后面写 T2T_2T2 的时候,想了想先跑回来写了个暴力程序就开始对拍。结果对拍到最后都没拍出错,我就以为自己是正解了。
谁想到根本就是个错解。最后只能听天由命,看官方数据怎么出了。
害,我应该写两段式把暴力嵌进去,分就能骗高一点。
T2
再次细读一遍题后,明显就是个 dpdpdp 。而且状态和转移非常好想。
我怀疑了一下,莫非 T1,T2T1,T2T1,T2 放反了??
但我觉得不可能,所以我就再读了一遍题目,终于在不合法的举例中明白了不能两边都放 ∗*∗ 。
顿时感觉难度上来了,顺次转移的 dpdpdp 似乎就不起作用了,根本记录不了前面是否放了 ∗*∗ 的状况,无法转移。
但我坚信,这一定是个 dpdpdp 题。
然后我就想到强制 l,rl,rl,r 括号匹配,然后枚举 l+1l+1l+1 开始的左边连续一段 ∗*∗ 和 r−1r-1r−1 开始的右边连续一段 ∗*∗,在这之前还预处理了一下 gl,rg_{l,r}gl,r 看 [l,r][l,r][l,r] 段能否全为 ∗*∗ ,作为系数。
这就是个区间 dpdpdp ,目前已经是 n3n^3n3 了。
迅速码完,测试样例:第一组过了,第二组呃……就挂了,看一看算少了。
这时我再次回到题目,顺便看看第一组样例解释。
仔细想了想,发现自己忘了 ()**()
的情况,也就是 l,rl,rl,r 虽然是左右括号但不一定要匹配。
具体操作是我得枚举 k,tk,tk,t 分别与 l,rl,rl,r 括号匹配,(k,t)(k,t)(k,t) 中间就得是连续的 ∗*∗,但这已经是 n4n^4n4 了。
显然后面需要优化,但是我想还是先把暴力转移码出来再说,至少得保证自己是对的,要能过大样例,超时都是其次。
挺好写的,再测试样例,然后第二组还是不对——又大了。
后面就开始一堆乱改,修了几个字符敲错,枚举长度少了点的锅。
测试样例,还是第二组!!!
我就有点无语了(⊙﹏⊙)。
这时候已经过去一个小时二十分钟左右了。
我后面两道题还没有开。我就先放了一下 T2T_2T2。
T3
我感觉是有点偏向结论后的模拟构造类型的,因为没有想到选了一个端点后再选一个,相当于中间某两个字符连续。
看了一下部分分,发现指数级的只有 28′28'28′,还有特殊性质的 12′12'12′,当时简单想了下特殊性质,因为考虑漏掉了一种情况,所以我以为非常简单,权衡一下我应该能拿到 40′40'40′。
迅速码完调了一些小错误,大小样例均过。
时间又过去了二十分钟。
最后我简单看了下自己的暴力过程,发现对于数据而言,有了剪枝,自己的程序应该是能跑过 40′40'40′ 的指数部分分。
所以本题我的预估是 52′52'52′。
到这里我看了眼 T1T_1T1 的对拍还在继续,所以此时在考场上的我,以为已经拿到了 152′152'152′。
T4
细读一遍题目后又读了一遍,我发现毫无思路。
果断看部分分,先思考了一下指数级别的暴力,蛮好打的,但是我发现还有多组数据的时间复杂度,一下子乘起来就还是会超时。
我就看 k=2k=2k=2 的部分,发现就是黑白染色,但当时没有联想到网络流的最小割。
脑子已经有点发热了,我就迅速写了个双向 bfs\text{bfs}bfs,调了一下,时间又过去了半个小时左右。
小样例又能过,大样例第一组就挂了。
随便一想就把自己 hack\text{hack}hack 掉了。
我马上明白这道题自己应该是拿不到一分了。
果断弃掉,回到 T2T_2T2 的调试。
T2
此时时间大概是过去了两个小时二十分钟左右。
我就开始分布调试代码,输出中间结果,然后人脑模拟第二个样例。
发现有一个中间转移的是错的,我就单独抠出来将样例缩小跑。
因为长度为 101010 人脑模拟起来就已经很吃力了。
我就缩小到了 888 再缩小到 777。
发现一旦超过 555 就会算出问题,但是当时没仔细管是算多还是算少。
突然我就反应过来,kkk 的枚举会算重。
我枚举了 k,tk,tk,t 必须强制 l−k,t−rl-k,t-rl−k,t−r 强制匹配,为了解决这个情况我就再定义了一个二位数组,强制匹配和不要求强制匹配之间互相转移。
小调了一下,大小样例全过,此时时间大概过去了三小时不到。
n4n^4n4 只有稳的 65′65'65′,考虑优化。
明显我能感觉到是前缀和的优化,但是因为我自己 ggg 的限制,就影响了我的前缀和优化,没有想到优化的实现。只能遗憾放弃。
后面又花了半个小时左右在 T4T_4T4 上无谓的挣扎,真的一点分都拿不到。
检查
此时的时间还剩下最后半个小时,我的四道题基本上已经做完,预估分在 205205205 左右。
我犹豫了一下是继续思考四道题进一步拿分,还是点到为止开始检查。
我想起了吴老师前一天晚上说可以莽一点,又想起了吴老师反复叮嘱低级错误的检查。
最后我选择了检查。
将文件输入输出注释掉,本地测试小样例,先保证中间调试结果都已经注释了。
然后我静态查错了所有代码。
接着看了一下 #define int long long
和 数组范围是否开小。
因为很显然的没有大空间的使用,我就没有计算空间复杂度。
紧接着解开文件输入的注释,本次测试大样例。都没有问题。
最后解开文件输出的注释,再次测试大样例。
问题出现了——T2T_2T2 一开始就直接输出 000 了,没有文件输出。
我就看了一下写的 freopen
。
原来我将输出的 stdout
错写成了 stdin
。
迅速改正,大样例再次过掉。对着这个错误我再次检查了其余代码的 freopen
问题。
我又打开了题目上面的文件名,因为不能直接复制,我害怕自己敲错。
就又对着一个字符一个字符的检查了一遍。
我疯狂 ctrl+s
,关掉 dev
。在自己准考证所在的文件夹里再次打开所有题目的代码,再次文件运行,看 .out
是否成功。
做完这些后只剩寥寥无几的时间。
没一会,“保持安静”,我的屏幕不再能动,CSP-S
就这么拉下了帷幕。
出考场后,我很庆幸自己检查了代码,保全了 T2T_2T2 的暴力。
非常不想听,却又听到了别人的讨论,听到他们 T1T_1T1 的 “线段树二分“,”是贪心吧。” 我就意识到自己的 T1T_1T1 假掉了。
然后尘埃落定,我无力回天。
总结
老实说我大部分时间都在前两题,尤其是第二题。
因为考试前我就做好了骗三四题分然后做一二题的准备。
如果我能很快做出一二题,还有时间我就再慢慢想后面的难题。
但是今年确实前两题,我都没有做出来。
后面大家讨论后,第四题网络流我也没有复习,就算想到了我可能也得调一会。第三题,我如果能多手玩几组认真想想,还是有可能做出来的。
但因为自己心态上就是想的骗三四题的分,主要先把一二题过掉,所以在考场上三四题的思维深度投入不及一二题。
虽然吴老师一再强调这只能算得上全真模拟赛,但是还是应该好好反思。短时间内思维是不可能有质的飞跃的,我能做的就是把自己能拿到的分数紧紧抓住。
所以对于本场表现,我对自己能够在最后检查出致命细节错误;也没有出现平时模拟赛过了一半代码敲完才发现自己题目读错的悲剧,反而通过样例和题面迅速理解题意;在第二题第一次没调出来也没有影响心态,相信自己后面能成功调出来(可能是平时调试多了,已经很相信自己分布调试的能力了(●’◡’●)),这几点很满意。
希望下一次 NOIP\text{NOIP}NOIP 自己能正常发挥,全力以赴,至少得超过一年前的自己吧!!
你再快都有比你快的,你再慢也有比你慢的!——《三体》
前进!前进!不择手段的前进! ——《三体》