NOI2020游记

Posted by wyj on August 20, 2020

Day -1

今天上午乘火车来到了长沙,是人生第一次坐高铁一等座,觉得好像和二等座也没什么区别(?)。下午来到了学校报到,宿舍里像xyx曾经描述过的一样,洗澡时脚下是一个万丈深渊。

这几天看见了B站上的一个视频,本来前几天我就想看看这个能不能在wine中跑起来的,结果一直没时间搞。今天在火车上(以及下午)没有任何事干,就加了群,下载了很多的以撒mod,包括第一人称、GoodTrip、跳动画、堕胎,以及这个Antibirth移植。发现GoodTrip是真的好用,堕胎是真的sb。Antibirth移植没有红钥匙,缺少灵魂。可惜的是想找mei的mod,没找到。另外我还下载了个羔羊永恒版,本来想看看羔羊的宝箱层的,却发现自己已经完全不会玩羔羊了,有九命猫还是七层暴毙。

Day 0

上午参加了开幕式,最后的特效真的很炫(然而snz认为不如去年的好看)。dzd说“剩饭要扣一分”,剩下的时间都在颓废羔羊永恒版。下午笔试之前也完全没复习,拿了垃圾妈刀,还是被羔羊版本的小蓝人暴打。更别提困难模式了。发现羔羊是真的难,所有怪物都跑得飞快,弹速更快,简直就像是不加自己移速的Speed!挑战。自闭了。

然后是笔试。居然出了“丢了密码条扣多少分”这样超纲的选择题。幸亏之前在UOJ上做过笔试,知道不要碰外设(当时还错了,记忆犹新)。不出意外地满分了。我校的其他正式选手也全部获得了满分。

笔试结束之后开始试机。这次我破天荒地没有写gedit等等软件的配置,直接去写代码了。键盘End键的位置极度反人类,并且Fn的位置也不对,无法用Fn+组合替代End。奇怪的是,貌似只有我和snz写代码时重度依赖End键,对(我校的)其他人几乎没有影响。

然后试了试机器的速度,写了个$5\times 10^5$长度的多项式乘法,大概要跑0.55s。由于是32位机器,把一些long long改成int会变快0.05s,区别不大。机器的速度比较正常,比我的电脑慢五倍,比tio.run快两倍。

根据试机赛的赛题推测,这次NOI会有交互,没有提答;并且开C++11!!!这应该是第一届开C++11的NOI吧,让我这个C++11重度依赖症患者很高兴。

晚上实在是没心情再颓废了,就写了下BM。发现自己已经忘光光了,只好看了看之前写过的再写。然而我还是忘了在递推式不变时要continue。然而lzq就轻松地写出 了BM。又去看了下暑假里训练的包。最后我实在是不知道还要学什么了,继续颓废。

Day 1

早上很早就醒了,在床上辗转反侧完全无法入睡。觉得我这辈子还没有经历过这么紧张的一天。吃了早饭之后觉得好了一些。使用诘将棋测试了一下自己的思维状态,发现不太行,最后一题死活做不出来。最后时间复习了一下自己的错误总结。

开题,发现的确有C++11。这次可不能不写配置文件了,花了14分钟完成了全部配置。然后开始看题。首先是T1,乍一看觉得是个矩乘sb题?再一看发现不太会。然后是T2,我乍一看,不是每条边都必须被选中吗?最后是T3,一看就充满了Ynoi的气息,很明显是不可做题,但是有不少部分分。回去看T2,发现并不是所有的路径都被要求了。于是马上会了个$O(n^2)$的DP,并且很快就发现连续段个数是$O(size)$的,所以可以用平衡树维护连续段,用finger search合并就可以一个log轻松过题了。然而这谁写的出来啊……只好写了个线段树启发式合并,这个线段树需要支持区间加区间乘,以及区间内二分,所以有点难写。我写了好久,样例又一直是0,发现自己犯了很多的低级错误,比如说从重儿子继承时没有更新线段树之类的。想用-fsanitize=address检测,却发现这个检测程序RE了(貌似是因为数组过大?)。过了大样例就不管了,拍都没拍。时间复杂度$O(n\log^2{n})$,期望得分$72$。此时比赛时间刚刚过半,觉得应该先回头去想想T1,维持xyx说的分数不等式。

我仔细想了想T1:首先有一个$O(Tm)$的简单DP。现在有$k$个关键点,我要知道每个关键点位置上的DP数组,所以要快速地在关键点之间转移。为了转移,我必须计算出来转移系数。有$O(n^2)$个转移系数,并且每个系数都是必要的,(当时我错误地觉得)所以肯定得要把转移矩阵中全部的元素都求出来。但是这题的边权不是1,不能简单的用矩阵快速幂计算出来$t$天中从$u$到$v$的最大愉悦值。所以得要把边权变成$1$,把一条边拆成五条边。然而这样做点数就太大了,最后三个点肯定是别想过的,就想想85吧。反正照样可以维持不等式。

于是我需要快速地计算出一个矩阵的$k$个高次幂。每个高次幂要是单独算,显然至少需要$(n+4m)^3k\log{T}$的时间,复杂度已经上天了。并且需要求出来完整的矩阵,所以不能预处理优化。貌似也没有什么办法可以快速地合在一起算。我就放弃了这个想法。(事后证明这是一个极其错误的决策,我应该满足于这个部分分的,不应该为了强行维持不等式而去死刚T1,有这时间我T2和T3还能写不少部分分的)

所以按照分数/时间的优先队列,我下面应该先去写性价比更高的T3。T3的前两档分都很蠢,我随便写写树状数组和莫队就过了。后面貌似可以暴力跑个四维莫队,但是我严重怀疑$O(n^{\frac{7}{4}}\log{n})$的复杂度连暴力的$O(n^2\log{n})$都不如,就没有去写它。期望得分$40$。

此时已经12点了,我必须赶紧拿出T1的一个高分做法才有可能获得一个正常的分数。于是我试着转换一下思维,可惜我还是跳不出求出转移矩阵的框架。此时我发现完全不需要拆边,从CF1380F的做法拓展了一下,我考虑从区间的mid附近长度为5的区间之内一定有一个分割点入手。由于是最优化问题,我可以暴力枚举在哪里拆分,用两边答案的乘积取个max。这样子矩阵大小就可以缩小成$n$了。并且跑了一下发现$10^9$的时候需要记忆化搜索468个状态。并且$k$次记忆化搜索并不是简单$\times k$的关系,其实很多状态可以重复利用,常数可以除以二。我就这么写了。

结果样例二输出$-1$。此时还剩十分钟,我心态都崩了。注定打铁了,Day2怕是snz附体都别想翻盘了。冷静思考了几分钟,我发现这么改其实是错的,因为一个关键点不止可能从前一个关键点转移过来,这里应该也要有一个长度为5的区间。此时已经来不及改回拆边矩乘了,我只好把每个关键点拆成5个重新跑。样例还是没过。

此时只剩两分钟了,我把代码移到正确的目录下,开始等死。幸亏我没有听广播的话,一直保持着永远打开代码屏幕的好习惯。看着看着,我忽然发现,拆的关键点的愉悦值我设错了!改了改,还是没过样例。还剩半分钟时,我发现关键点所在的点我也设错了。改了下,样例终于过了!!!!!!!!!!!!也许还有救!!!!

就是这样,我在比赛结束前20秒钟过了T1的样例。真的感觉心脏都快从嗓子眼里跳出来了(不是夸张修辞,真实的身体感觉就是这样的)。无法期望得分。

出考场发现除了我之外所有人的得分都是2字头。并且T1真的是一道sb题,我怎么没想到压根就不需要把完整的转移矩阵求出来呢!被暴打了。回宿舍测了一下,发现自己T1的乱搞满数据本机都要跑2s,没救了。期望得分封顶$65$,并且可能我还有什么锅没有修,或者有算法的本质问题。

复评。发现我T1真的是假算法,只得到了35分的安慰分。输光了。幸好T2的两个log多过了一些分。真实得分$35+80+40=155$。具有讽刺意味的是,这个得分相比去年没有任何的改变(可能这一年本来应该提高的OI水平都错误地转化成以撒水平了吧)。很明显我凉了。想到自己六年多的OI生涯就要这样毫无结果地结束,无限自闭。擅长乱搞的lzq获得了260的高分。srf也得到了期望得分252(他两个log过了T2)。不知道为什么高一的其他人都比我崩得还惨,觉得他们平时训练比我强多了啊?

晚上真的自闭了。snz等人出去听讲评了,我一个人在宿舍里单曲循环《记昨日书》。同样是唐映枫写的词,觉得这首比前面我解读的那些都要晦涩一些。

Day 2

我本以为自己已经彻底躺平了,早上却还是辗转反侧。刚到考场时一看题目名称,surreal?!看来我之前看的M67博客说不定真的有点用了?!于是马上在脑海中回忆了一下超实数的运算定义。然而开题之后发现,半点关系也没有。白高兴一场了。虽然这个题目风格明显是在模仿《研究之美》。

这下子是别想翻盘了,于是我在9点之前一直在回忆自己的OI生涯,感慨万千。最近我应该会写一篇回忆的博客。9点之后我觉得不能再这样了,不然连Ag都要不保了。于是开始看T1。乍一看,很网络流?然而发现网络流压根就无法处理$\le 2$的限制。看了看部分分,都很奇怪,并且一点思路都没有。给人一种贪心题的感觉?还是先别看T1了吧。

于是看了下T3的题面,乍一看这不是选最短的一条(非割)边就肯定可以满足要求了吗?然后才意识到还有$s$和$t$的限制。那么不是跑个最短路就得了吗?结果发现第一个样例就在打我的脸。然而貌似所有边权都相等时最短路就行了?于是就写了个边双+Bfs,获得了期望得分$20$。

接下来回头去看T2,有点像个分类讨论?然而怎么讨论都是假的。于是我继续去看部分分,发现所有树都是链是很sb的,但是只有一个点。貌似特殊性质4和所有树都是链差不多?当时我做了一个错误的假设:只有根节点上的叉是有意义的,别的都没用。于是这个叉可以满足所有同时包含两个子树的树,只要把左子树和右子树分开处理就行了。于是我试着拓展这个做法。貌似我可以把叉也拆成左子树和右子树的,分别做?时间复杂度显然是线性的。但是我写了一发却WA了样例4。删除了样例4中无意义的树之后,我发现了问题所在:不能把叉分开来做。但是现在已经可以过很多分了:包括$maxh\le 2$和特殊性质3、4。此时我又做了个错误的决定,不去写T1的暴力,而是试图修复T2的锅。

我试着把记录的点改成一个集合,不分开来做。然而发现我认为所有的输入都是Almost Complete的,才发现有些集合是空的,会导致答案变成$0$,但是我就不会递归访问这些集合。此时我只好把代码回滚到之前记录点的版本,准备开始写T1的暴力。

然而此时我鬼迷心窍,忽然就找到了如何判断是否有本来应有的集合不存在的方法,用个unordered_map<ll,unordered_set<ll>>就可以判重了。我把它写完,发现它不负众望地过了样例4,却还是WA了样例5和6。不知道为什么,现在我会把有解的判成No。此时比赛时间还剩五分钟,我来不及去写T1的暴力了,只好弃疗。心中觉得自己已经银牌无望了。

出考场发现大家的得分都普遍不高,心理稍微平衡了一点。下午复评咕咕咕。复评终于开始,我发现自己T2得到了40分。最终得分$0+40+20=60$。很棒呢,得到了去年Day 2得分的$\dfrac{1}{3}$不到。

晚上被叫去试图换约。然而面试结束之后,等了两个小时还是什么事都没有发生,多半是凉凉了。

Day 3

晚上睡得相当不好,我们寝室的人全都几乎没有睡觉。空调时好时坏。本来去听论文答辩的,却发现位置完全不够,只能站着听,就溜了。溜到一半还被叫去搬椅子。然后是闭幕式。只拿到了一枚垃圾银牌,很丢人。我们学校只有snz和lzq拿到了金牌,其他人都是银。我人生的第一次和最后一次NOI就这样惨淡地结束了。

复盘

这次比赛主要的败笔是Day1 T1,我如果思维没有陷入死胡同的话应该是可以轻松切掉这道简单题的。但是致命问题在Day2 T1,看完题解之后我觉得按照我那几乎等于没有的贪心水平是无论如何都不可能观察出来$m=n-1$怎么做的,所以自然无法得到一个高分。所以就算我正常发挥切掉Day1 T1,也没有可能进队。还有Day2 T2,虽然实际上我的最终代码和正解只差删掉非“毛毛虫”的树一件事,但是这件事我是不可能想出来的(完全没往树形态那方面去考虑),所以也没什么希望。总之,这次就算我完美发挥,也没有进队的可能。