【删改版】NOI2020 退役记
NOI2020 退役记
day\(-\infty\) int main()
The Road goes ever on and on
Down from the door where it began.
在学习OI的期间,几乎没有在外面报班,仅有的一次是在进二附中之前,报了一个省选的班。尽管发的讲义还有很多没有弄懂;但是认为把新的东西巩固更加重要,于是就放任了。
养成了自己做OI笔记的习惯,也写过自己的博客。
偶尔会打几场比赛,很少自己做题,也很少锲而不舍地订正题,训练量非常少。
day0 {
Now far ahead the Road has gone,
And I must follow, if I can,
到达。休息。开幕。合影。笔试。
考前,华二的队员们集合,开会:
- 金老师の考前动员
- 想好考试策略,做好时间规划,做好出岔子的准备。
- 这次比赛只要求稳,能发挥出80%的实力就行。
- 左骏驰の考试经验
- 调不出来可能是算法假了=>去一下厕所,冷静一下。
- 比赛中,要把三题都看完,因为加在一起一般会有超过60分的暴力分。
day1 "OK check"
Pursuing it with weary feet,
Until it joins some larger way,
考场上,我吸取在WC上的教训,把前三题都看了一遍,发现我只有T1有思路:它和我之前见过的矩阵快速幂模型有点相似。于是去考虑它的DP式子,就得到了一个点在时间上拆点,直接暴力矩阵乘法的做法,我算了一下复杂度,是\(k(5n)^3\log T\)的,只能拿大概85分。
在T2和T3都不可做的印象下,我选择了先写T1,写着写着突然想起了之前模拟赛有一次提到了矩阵快速幂的一个优化:直接用结合律,每次用向量去乘矩阵就行了。复杂度优化到了\((5n)^2(5n+k\log T)\)的,可以得到100分。此时考试大概过去了1个小时。
之后去想T2,感觉完全不会做,感觉是一道容斥神题,于是爆推式子,最终在推了一两个小时的式子后,得到了一个比较优美、代码量较小的40分做法,然而路径是一条链的性质完全不会用……写完之后,大约还剩2个小时。
去做T3,发现写了暴力和A档区间逆序对之后会有比较可观的成绩(40分),于是花了大概一个小时把它写完了。在最后一个小时,我面临一个抉择,是继续去想T2,还是对拍T1,还是把刚刚想到了C的T3写完?由于对自己的代码能力的自信以及T2的没有思路,我选择了写T3的这12分。
最后写完时,还剩下~20min,来不及了,于是将自己的代码检查了一遍又一遍,尤其注意了文件输入输出(曾经被坑过)。
查分时,一分没挂:100+40+52=192。看了一些其他人的成绩,感觉还行:自己这次几乎把能拿的分都拿到了。
不过,T2没有想到树形DP,还是积累太少了……
晚上,自习室空空荡荡的,我非常累了,打不动代码,只是默默等待这一天的结束……
day2 "FST"
Where many paths and errands meet.
And whither then? I cannot say.
考试开始之后,照常先看题意,发现T1是一个在省选期间见过的模型,但是一时半会想不太起来,感觉很有希望做出来;感觉T2是一个猜结论神题,但是题面太长了,导致我看完之后半个小时都过去了;T3是个弦图的题,看着就感觉非常不可做的样子,于是连部分分都没看就回去想T1了。
T1的结论非常简单,在部分分中也有所提示,那就是\(m\ge n-1\)时始终有解。在\(m=n-2\)时需要用背包将它分成两个\(m=n-1\)做。我算了一下复杂度,发现朴素实现是\(O(n^3k)\)的,可能可以拿到70分,有一点悬。于是我决定进行卡常。我做了一个假设:一个可行解的前\(i\)个编号的菜的和不超过\(\min(i-1,\lfloor n/2\rfloor)k\)。这样可以大大减少我的常数。过了所有样例之后(而且其中的一个样例的ans
甚至和我的out
一模一样),感觉比较稳,可能能拿到85分,就没怎么检查了。这时大约过了1h40m。
因为感觉T3不是很可以做,于是我开始推T2。我一开始想了一个类似3合一的思路,后来被我找到反例了,感觉很自闭。因为我感觉如果想出来T2就可以获得决定性的分数,于是我开始画图找正确的规律。过了30分钟之后,我想到了一个看起来是对的,且可以简化程序设计的性质:对于一个有两个相邻叶子的链式树,它必须被其自身匹配。我花了十几分钟把它写了出来,发现它过了前4个样例,在第5、6个大样例上WA了!
我之前想到了一个可以证明这个结论的说理过程,于是我的第一反应是我的实现有误,在看了几遍代码无果之后,我开始想写暴力和数据生成器来找到是哪里WA了,顺便保证前几个测试点的分数。在此过程中,我发现暴力出奇地难写,调了大概1个小时都没有调出来,感到有些自闭。于是我开始手推一些例子,结果发现我之前的结论错了!
这时候还剩大概一个小时多一点,时间有些紧张。我决定去一下厕所,理清自己的思路。但是我感到非常紧张,大脑一片空白,也没有想到妥当的解决方法。在这时,我决定去拿T3的暴力分。在手玩了几个例子后,我笃定了子任务A的结论:要么无解,要么是最短路。为了判断无解,我有两种思路:将最短路割掉之后dfs、或者用tarjan判定强连通分量。在写了一会tarjan之后,我决定使用更加稳妥的dfs方案。大概半个小时之后,我把它写完了。笃定最后一题肯定有一个输出-1
的点,我把写到一半的tarjan写完了,用if-else将它和之前的代码分开。
最后半个小时,我回到了T2上,我想了一下我之前的做法,感觉它能比较稳定的通过所有特殊的部分分。但是为了求稳,我写了性质3的特殊做法。
检查完文件输入输出之后,我关闭终端,关闭pdf,比赛就这样结束了。
估分:85+?+20=?
比赛之后,和同学们讨论之后,发现T1需要bitset优化,而且我的DP的复杂度也多了一个\(n\),感觉要60了,很慌。T2被wcz当场切掉了,而我自己的分数未知。T3的另外一个子任务可以被DP/贪心搞定,但是我没有拿到这25分。感觉很不稳,觉得没有希望了。
分数出来了:40+44+20。T3有一堆TLE,如果我不加if-else的话,我甚至有爆零的可能!T2的得分超出我的预期,但T1的低分使我大跌眼镜,百思不得其解。
当我跑官方数据时,才发现原因在于那个奇怪的结论:它在 \(m=n-2\) 的许多情况下是错误的!于是我的代码在很多包含\(m=n-2\)情况的测试点中爆炸了……
走出考场,感到有些失意。
反省当时的考试策略,发现颇有在T2上孤注一掷的意味。这应该是因为期望过高,不符合实际。它奠定了今天的失利。
如果当时听了金老师的建议(”求稳“),放弃T2,想出T1的满分做法(已有一些眉目)并且写掉T3的25分(仔细看限制即可想到),结果应该会更好:这次已经拿到的分都会保住,而且可以多拿60+25=85分。
犯这个错,主要还是因为做题太少,比赛经验太少,和其他选手交流太少,而且因为是最后一次比赛了,心态不是很平衡吧。
希望未来的OIer们在他们的OI之路上,避免犯我这样的错误。
晚上,LCA的Lemon OI版出来了,在zjc的撺掇下,我也看了。
看完之后,我开始想之后能为OIer们做些什么。在过去,我从很多OIer的博客中汲取养分,也被他们的讲课所启发。索取的时候结束了,我感到是时候回馈了。
但是前路茫茫:我可能会将自己的笔记整理一下,放在博客上。希望在它们销声匿迹之前,它们可以影响一些人,给他们带来启发。
day3 return 0;
答辩。颁奖。闭幕。合影。聚餐。夜聊。离去。
尾声 }
The Road goes ever on and on
Out from the door where it began.
Now far ahead the Road has gone,
Let others follow it who can!
Let them a journey new begin,
But I at last with weary feet
Will turn towards the lighted inn,
My evening-rest and sleep to meet.
我熟悉了一下各位OIer,加了他们的联系方式。
我的故事已经结束,而他们的才刚刚开始。
祝他们一切顺利,在OI之路上能越走越远。
在这里,我想感谢金老师,以及他提供的帮助和支持;感谢zjc、hwy、zbw等热心助人的OIer们答疑解惑;感谢自己的家人对我的支持。如果没有他们,我肯定走不到这么远。
最后的最后,祝信息组在未来越办越好。