NOIP 2018 游记
写在前面
初赛成绩 90,没有悬念地进了复赛。
由于去年已经参加过一次 NOIP,并且也拿到了一等奖,所以今年内心的压力也不会特别大吧。
考试前一天的上午写了一下平衡树。我感觉每次写平衡树我的板子都要改进一下。不知道会不会考到呢?
11.10 (Day 1)
8:30 准时开考,拿到题之后顺序开。
看了 T1 我傻了。居然是积木大赛原题?NOIP:我考我自己。不管了直接码码码,然后过了大样例就把 T1 扔了。
看了 T2 第一反应是小凯的疑惑加强版?简单推了一下发现若一个数可以表示成若干个比它小的数的和,那么这个数就是没用的,可以删去。所以现在的问题是怎么判断一个数能否被比它小的数表示出来。看了一下数据范围,最大数据的 \(n = 100, a_i = 25000, T = 20\),\(O(\max \{a_i\} \times Tn)\) 的复杂度可过,于是直接排序后做完全背包就完了,写完也一遍过了大样例。
此时时间是 8:41,前两个题几乎没怎么花时间,所以剩下的时间很充裕,因此觉得自己应该能把 T3 也写出来。
T3 刚读完题之后没啥思路。不过二分模型比较显然,二分完长度 \(w\) 之后的任务就是从树上找出尽可能多条长度不小于 \(w\) 的路径。此时突然想到最近在 CF 上做了一个类似的树上找路径条数最值的题,那道题可以用贪心。于是想一下这个题能不能也贪心。发现可以记录每个点返回到父结点的路径长度,那么对于每个结点,尽可能多地合并子结点路径,最后再取剩下的最长的作为返回到父亲的长度即可。这一操作可以用 multiset 实现,那么总时间复杂度就是 \(O(n \log n \log w)\) 的,最大数据 \(n = 50000\),可过。写写调调后一遍过了三个样例。
后面自己又出了一组 \(n = 50000\) 的菊花图,在 Linux 下测一下时间,发现跑了 1s 多一点,过不了。于是又卡了卡常,修改了一下二分上界,卡进了 0.7s。
此时还剩两小时左右。我依然不太确定我 T3 的做法是否正确,于是又推了一下贪心的正确性。最后检查一下文件名之类的东西就等着考试结束了。
考完下来,和其他同学交流。fwat T3 也写的两个 \(\log\) 的贪心,我心里才觉得稳了一点。他今天应该也是 AK 了,其他同学好像多多少少都挂了点分。
后面听说今天考了三个原题也真是无语。
下午默写代码后在 luogu 上评测,很高兴的是,我和 fwat 都没有挂分,都拿到了 300。
不过其实今天几乎都是 255+,并没有多大区分度。因此希望明天也能考好吧。
11.11 (Day 2)
画风清奇的一天。
T1 读题就读了许久。并且由于题读错了,我甚至还觉得样例有问题,于是向监考老师求助,然而得到的答复是不予回答......
无奈只好先看 T2。T2 看完题后很 naive 地以为只需按列依次考虑,保证一个格子的下边格子的值大于等于右边格子就好了,于是直接写了个矩阵快速幂,结果死在了第二个样例。确保不是程序写错后,又推敲了一下自己的做法,突然想到存在交叉的路径可能在之前完全相同,此时一个格子的下边格子的值必须和右边格子的值相同,这一点是不能直接体现在状态中的。于是只好放弃了这个错误的做法。
此时已经开考了 40 分钟了,我一分都还没有拿到,心里开始慌了起来。
又不甘心地回头看了看 T1,再次读题确保题意,然而我还是没看出我的理解有什么问题。此时我再次找监考老师确认题意,监考老师说可以向上面反映一下。过了一会儿,我得到的答复是:题意没有问题。
我这下真的慌了。开考已经一小时了,我是真的一分都没有拿到。但是 T1 我绝不能不写,于是我对着样例猜了个题意,猜要求的是最小的 dfs 序,然后写了个 \(O(n^2)\) 暴力删边+遍历。令人惊喜地是,居然过了所有的样例。我庆幸自己猜的题意应该是对的。
此时时间大约是 9:40。我还是准备再看看 T2,看有没有什么突破。然而我想出的状态总是多多少少有些问题。无奈最后决定打暴力。由于最开始想的矩乘的做法对于 \(n = 2\) 的数据是没有问题的,因此我直接保留了下来,然后写了份暴搜处理小数据,再用暴搜和矩乘拍了一下,确保无误。这样这个题一共能得 50 分。
写完 T2 部分分我还是不太甘心,于是又想了一会儿,但还是无果。此时已经快 11:00 了,我不能再拖了,于是赶快扔掉 T2,看 T3。
T3 读完题之后一眼动态 dp。然而学习动态 dp 已经是四个月前的事情了,并且当时也只是粗略地看了一下,细节什么的也忘了,感觉自己考场上最后一小时推+写出来不太现实,所以直接写了 \(O(nm)\) 的暴力 dp。这样今天的总分估计是 100+50+44=194。
还剩半小时,想再拿点分上 200。此时突然看到 T3 中间有两组树深度较小的数据,发现由于每次修改只会影响两条链的 dp 数组,所以深度较小时可以直接暴跳父亲结点修改 dp 值。于是赶快改了改,拿到了这额外的 8 分,这样总分就有 202 了。还剩最后几分钟,又检查了下文件名,确认无误后等待考试结束。
感觉今天弱爆了......当然还是自己菜。
出考场后感觉似乎今天很多同学还是没考好。于是只能默默祈祷,也祝我自己不要挂分。
下午还是默写代码然后在 luogu 上测评,还好的确没有挂分(T2 居然还多过了一个点)。
感觉 T2 全世界都打了表找了规律就我没打表......
这样,两天的总估分就是 300+202=502,但愿这次的 NOIP 最后能以我期待的分数收官吧。
11.20
出成绩日。
最后成绩果然和我预估的一模一样,502 分,因此没有什么情绪上的波动。
不过很多同学的最终成绩都和预估或者自测成绩有多多少少的出入。算是几家欢喜几家愁吧。
后记
对于一同考试的部分同学来说,这是他们的最后一战,是满意还是遗憾,都已经过去了。
然而这对我来说并不是结束,还有半年多的时间需要努力,NOIP 暴露出的问题也应该要及时弥补。
加油吧。