我简直是咸鱼,一只彻头彻尾的咸鱼。
慵懒,成为了我本次比赛的主调。
10 月 27 日晚上——也有可能是 10 月 28 日的凌晨,睡眼惺忪的我坐在书桌前,照常奋笔疾书着。作业本放回一本又拿出一本,练习材料做完一张又掏出一张,我就这样机械着循环反复着,完全看不到尽头。
在这种困倦又疲劳的情形下,我申请了停课,开始为 CSP-S2 做准备。
写完停课申请的我仿佛如释重负,用最后一点气力把作业扔到一旁,然后摊到床上,不久就睡熟了。
为期三周的训练,是缓和而有趣的。每天早上七点钟起床,慢条斯理地吃完早饭后悠闲走到学校,参加校内举行的提高模拟赛。在三个半小时里,我只愿意思考每题的满分做法,对部分分置若罔闻。倘若遇到三道简单题,被一个半小时穿了,我们便开始“指责”出题人不会出题;倘若遇到难题,思考无果或想到一种码量超级大的做法,我们便开始骂出题人毒瘤。下午原本安排的订正计划被我直接抛到脑后,跟着几个同学带着麻将,到隔壁空着的 VR 教室一起玩。一个个工作日,就在这样“欢快”的气氛中,快速地流去。
11 月 15 日,第二天就是正式比赛了,但我不想紧张,也懒得紧张。我自大地认为,凭借我的能力,两天比赛总分上 (500) 不在话下,考前只要尽可能放松就可以了。
11 月 16 日,CSP-S2 2019 Day1。
考点就在自己的学校,我感受到了极大的便利。不单是仅靠步行就能到考点,更是我熟悉这里键鼠的手感。如往常一样的,熟练地接受安全检查、熟练地找到自己的位置、熟练地关掉安全软件、熟练地配置好 FrC……一切都是那样熟悉与亲切。
8:30 准时开题。
看到第一题时,我被那长长的题面吓了一跳。
细细读完后,发现只需模拟题意反着推一遍就可以了,再观察一下数据范围,(n le 64),那需要 ( exttt{unsigned long long}),输入是 ( exttt{%llu})。另外就没有什么细节了,我就开始实现。
大概 8:40 的时候,过样例了。我又测了一组 (n = 64, k = 2^{64} - 1) 的数据,发现输出是 (10000dots),感觉很有道理,就没有再管它,去看下一题了。
第二题似乎是要求括号序列数。读完题,我第一时间的反应是:
根据套路,某个点之前的括号序列不好统计,那就统计以某个点为结尾的。
根据套路,括号序列可以用一个栈维护。一个右括号可以与栈顶的左括号转移。
于是我会做序列的情况了。
根据套路,dfs 到树上的一个点 (u) 时,dfs 栈内所有点恰好是 (u) 在树上的所有祖先节点,且按照顺序排列。
于是我也会树的情况了。
又思考了细节,似乎没有的样子。
接着就开始打了,大概 8:50 的时候过了样例。然后写了个 (mathcal{O}(n^4)) 的暴力作对拍,就放在一旁去看第三题。
9:00 进入第三题,似乎可以 AK 的样子。
读完题:这题还挺有意思的。(mathcal{O}(n log n)) 做法似乎很不好想。
看到 (n le 2000):天哪这不是简单题吗,把贪心 + check 路径的 (mathcal{O}(n^3)) 用树剖之类的东西维护一下不就做到 (mathcal{O}(n ^ 2 log n)) 了吗。
接着开始写,写了半个小时左右,发现过不了样例的第二组数据。小黄鸭调试法找不出什么问题,手玩一下才发现 (5) 号节点上不去,而题目要求每条边必须被删除。换句话说,我想的贪心是错的。
我无比懊悔,赛前教练无数次地提醒过,想到一个做法时,一定要仔细检查它的正确性,以及注意它是否存在细节和边界问题。在这题上,我被欲望冲昏了头脑,忽略了教练的忠告,导致了将近一个小时的时间被浪费。
我开始苦想正解。大概一个小时后,我还是没有任何思路。
11:00,我才终于决定写第三题的暴力。
根据我的经验,这样的题目,暴力应当是很好打的。在往年的 NOIP 赛场上,每题的暴力分都达到了大六七十。
(n le 10),随便 (mathcal{O}(n!)) 枚举一下就行。
树退化成链,贪心从小到大考虑……诶等等,一个节点似乎可以把它的权值先转移走,再赋为其它的权值……这样与先交换后跨点交换好像是等价的,那就对原序列建一个双向链表,然后维护一下贪心似乎就可以了。
我这么去写了,写了半个小时,又调不出来。而且还不知道是做法假了还是实现假了。
算了不想链了,去想想菊花。菊花似乎就是找到一个大轮换,使得排列字典序最小。那这样直接贪心找并查集维护就好了,感觉复杂度没有问题,还特别好写。
五分钟左右写完了,过了样例,(10) 以内的数据和暴力拍没有问题。
剩下的时间我全部在调链,始终没调出来。
最后一题 (35) 分收场,太难过了。我无比自闭,因为我的经历告诉我,一名出题人,尤其是在这种官方比赛里,如果出了一道难题,那么部分分一定会给非常多;这也就是说,如果一题的部分分非常少,就说明这是一道简单题,除非出题人希望被喷。
按照这种部分分水准,这题应该是一道简单题,应该又是一天全场 AK 的 Day1,又是一天没有区分度的 Day1,但我被区分了。
出考场时,出我所意料的,又如我所希冀的,我校一位 NOI 银牌大佬开始问候 T3 出题人的家人,旁边还有一群人跟着附和。
我上去打听了一下,没有一个人写出正解,也没有一个人写出链,甚至没有一个人写出菊花,全部都是 (10) 分。
有一位同学想出正解了,但他说细节太多代码非常难写,三个小时打不完。
有好多同学有 (mathcal{O}(2^n)) 做法,但出题人没给部分分。
还有一位同学有 (mathcal{O}(n^5)) 做法,但出题人也没给部分分。
我在疑惑与不解中,结束了这没有区分度的 Day1。考后把程序放到各大 OJ 的民间数据测,结果都是 (100 + 100 + 35 = 235)。
11 月 17 日,CSP-S2 2019 Day2。
这真的是我做过的体验最好的一套题,发自心底地说。
区分度良好,思维难度不太大,码量适中,有 AK 可能性。比 Day1 好了太多太多。
第一题,果不其然来了一道 (998,244,353)。我一开始想的是枚举菜品数,然后组合数计算方案,结果发现 (a_{i, j}) 可能不同,组合数派不上用场。
正卡壳之际,我又想起教练赛前传授我们的经验:题目给的每一个条件都至关重要,不能浪费。于是我开始考虑这个 (lfloor frac{k}{2} floor) 的限制有什么特殊之处。
自然地,我想到了只会有一个数大于 (lfloor frac{k}{2} floor)。也就是说,一种不合法的方案中,一定有且仅有一件主要食材超过使用限制。这使得枚举不合法方案成为了可能,容斥的做法被摆上了台面。
接着,我大胆的设计了一个状态为 (n^3m) 的 DP,因为我知道这肯定可以优化。果然发现有两维可以作个差分压成一维,于是复杂度就变成了 (mathcal{O}(n^2m)),通过了第一题。
这时候已经接近 10:00 了,我寻思对拍很难写,时间也不太够,就懒着没有写对拍。
做完第一题后,我同时看 T2 和 T3。发现 T3 的 (75) 分暴力非常好写,性价比极高,就花了十几分钟写完了,过了样例。同样是没有对拍,因为太懒。
我深知,Day2T2 决定了全场比赛的成败。它不如 D1T1, D1T2, D2T1 一样自带签到属性,也不像 D1T3, D2T3 那样压轴防止 AK。作为腰部,一场比赛真正的区分度都需要在 Day2T2 这道题上体现。它往往思维量极高,极其考验选手能力。
我很快会了 (mathcal{O}(n^2 a_i)) 的 DP 做法,大概有 (24) 分。
注意到区间和只有 (n^2) 种可能,我把 DP 优化到了 (mathcal{O}(n^3)),大概是 (36) 分。
把递推式写出来,发现可以用后缀最小值优化转移,我又得到了一个 (mathcal{O}(n^2)) 的做法,(64) 分。
这里状态就是平方的了。接着一个小时我全部在思考如何优化这里的状态数,大致思路是从分析 DP 值的单调性开始,然后试着能不能离散,用动态开点线段树去维护每一个 DP 的状态,然后线段树合并之类的整体 DP 技巧进行转移……
我还是不会,然后就果断放弃了,因为这样就算会了也打不完,只好 (64) 分交卷。
考后证明了,这道 Day2T2 是我最后悔的一题。
我随便问了几个同学,要么说自己看到题一眼秒掉,要么是不会高精度的拿了 (88)。当我问他们怎么做时,他们的回答是:“这不是睿智题吗,猜个结论就过了。虽然我不知道这个结论为什么是对的。但是你看着数据范围,显然不是个大聪明就不会往 DP 这方面去想嘛,这种 (4 imes 10^7) 怎么可能是 DP 呢,肯定是贪心或结论题啊。”
看来还是自己经验不够,我果然又被区分了。
Day2 结束了,民间数据测出来分数仍然是 (100 + 64 + 75 = 239),各 OJ 测都一样。
总分只有 (474),随便问个人都是 (485, 498, 499, 504),我哭了。
这道 Day2T2 给我留了太大的遗憾,到头来追究原因,才发现自己的失败在自己的慵懒中早已奠定。
我开始懊悔自己考前没有认真对待模拟赛,没有端正自己的考试策略。
我开始懊悔自己考前没有多刷题,积累做题套路。
我开始懊悔自己考前没有勤写题,导致写题速度偏慢。
我开始懊悔自己的懒,自己的妄自尊大。
结束了,回去学文化课了。
我感谢这次竞赛的经历,它带给我许多宝贵的东西。它让我意识到,自己作为一名普普通通的高中学生,所拥有的知识量是多么的浅薄,所了解的世界是多么的狭隘。我也从中感受到,学习是多么幸福、多么重要的一件事,只有努力学习积攒知识,才能被更多人正眼相待。未来路上,我将更加努力前行。