NOIP2017游记

Posted by Panda2134's Blog on January 20, 2018

考完NOIP已经2个月了,也是时候写个游记了。

考前

还是得从NOIP2016讲起。去年NOIP,我啥都不会,然后原地爆炸,赛场上调试3个小时线段树导致day2差点爆零。由于去年NOIP炸飞的缘故,在NOIP2017之前我基本没学什么超出“暴力、DP、图论基础”之外的算法,只是想把基础的东西学好。确切地说,去年NOIP之后很长一段时间我都几乎失去了OI的信心,大致说来,整个高一都投入在文化课中了吧。 也没有什么不好——毕竟在学校上课我也学到了很多。不过整个高一OI大致是荒废了。

作为一个初中玩了3年Minecraft,高一搞了一年文化课的OIer,我知道今年是我最后的机会了。七月份我出去培训的时候就定下目标:如果NOIP没上400就直接AFO。在培训的时候认识了Night_Aurora神犇,从而发觉自己有多么渺小,自己会的算法是多么的Naive。回来之后,我又定下一个自己觉得很远大的目标:刷完洛谷的提高历练地里面所有的DP题,并且在10分钟之内写出NOIP难度DP题目的方程。不过神犇们可能觉得很简单就是了(笑)。

9月,又是熟悉的开学季。想了很久,决定停晚自习,因为还有很多的算法掌握不熟练。当时就算是停了晚自习也感觉时间不够。chrt学姐跟我说,“只要抓紧时间,时间就是足够的”。然而对于一个每天作业写完都有难度的人来说,好像不那么容易。停晚自习后不久,班主任又表示竞赛没有太大用处,劝我专心搞高考。他说得对,搞高考的话我可能会轻松一些,也许还能搞个裸分thu什么的。不过我既然有了目标了,就得走下去,“自己选择的路,跪着也要走完”,不是吗?

似乎很多算法还不会,连历年NOIP的DP都还没完全弄清楚,就到了初赛。做了2015年的初赛题,感觉难度还可以接受,然后考前一天才发现自己连二分的复杂度都不会算。急忙背完了主定理,就上了考场。考完了,成绩下来了,果然一塌糊涂,只有50。同市的最高是mhb学长,而他比我高39分。再看看兄弟学校的同学,好像最低分都比我高?……

这时候我觉得是时候停课了,是时候拼一把,也许是最后一把了。初赛考完的那天,我不辞而别。那之后的几个星期,我复习了不少的东西。没敢学啥新算法,因为NOIP2016的阴影。我印象最深的,一个是洛谷的珂学模拟赛,还有一个就是NOIP2015的货车运输。我以前一直以为那题只能用高级数据结构什么的做,没想到标算是二分+树上差分,跑的还挺快的。彻底停课一周后,年级主任要求我回去上数理化,我虽然不是很愿意,不过考虑了一下,还是答应了。考前一个星期,我准备呆在机房,最后把所有知识点都过一遍。然而班主任让人给我带话,要我回去上课。我们教练听说了很生气,给我们班主任打电话说了很久。不管怎么样,我最终还是没有回去,复习完了NOIP。

11月10号,我坐上了去武汉的火车。路上,mhb学长给我科普了半天珂朵莉。我和他住一个房间,到了酒店他就开始看番。当时我心里还是有点紧张,不过想想也释然了,不就是AFO与否的事情么?考前打了一堆板子,写了不少的总结,晚上10:30就早早睡了。0:30,听到对面房间有青轴键盘的声音。并不清楚怎么回事,不过把耳朵捂着,还是睡着了。

考中

11.11。8:30。屏幕上面显示着“Bu%WangChu&Xin!”。电脑是坏的,不能显示桌面,换到了机房最后面的一台电脑。扫了一眼第一题,发现程序文件名是math.cpp/c/pas。忽然回忆起早上学长说要复习扩展欧几里得,看了半天的数论。太神了,这么快就应验了吗?试着推了一波式子,没推出来。过去了20分钟,我决定写60分部份分。打完了玄学暴力,9:10。一看第二题,似乎是未来程序改弱化版?不管了敲敲敲。敲完了暴力就测样例,woc怎么样例都没有过?等等……好像输入写错了XD。改过来了,测了一波大样例,又手玩了一下,感觉应该A了,就去写T3。T3我最开始没想到缩点,等等11:10才发现零环可以缩掉。大概11:30搞出了最短路计数的DP方程。估计时间不够打缩点了,拿map水了一发暴力DP,期望能60。

出场后发现T3思路没错,但是T1是小学奥数题。……

(又:回去后班上某数竞同学说他跟我说过这个结论srOOrz)

玩了一会MC,下午感到莫名的伤感。想想自己学了这么多年OI最后可能落个NOIP AFO的下场就觉得很悲伤。听着“君をのせて”,听着听着就哭了。

晚上订了一份外卖,今年也有学长回来看我们,不过我没有去。晚上重新看了一遍去年愤怒的小鸟的代码,同时气了半天为什么这么明显的状压DP当时没有看出来。他跟我他推出了T1的式子,还说今天很多人考炸了。不管怎么样,明天考完了结果就定了。

11.12。8:30。抽到了五楼的考场,这意味着要在一个通风不好的环境下感受出题人令人窒息的操作。打开题目一看,今天的T1似乎可做?敲完了暴力,想了想还是没开long double,觉得eps = 1e-9应该够用了。于是9:00开始写T2。$n \leq 12$ ?难道是状压DP?脑补了20分钟的各种DP方程,都因为不满足无后效性而被抛弃。去上了个厕所回来,发现:如果一个方程不满足无后效性,为什么不考虑2个方程互相递推呢?于是我就写了这么一段代码:

int DP(int S) {
    if(vis[S]) return g[S];
    vis[S]=true; int V0=0;
    for(int v=1; v<=N; v++) if(S&(1<<(v-1)))
        for(int u=1; u<=N; u++) if( (u!=v) && (S&(1<<(u-1))) ) {
            if(G[u][v] != INF && DP(S^(1<<(v-1))) != INF){
                int cost = DP(S^(1<<(v-1))) +
                     (f[S^(1<<(v-1))][u]) * G[u][v];
                if(cost < g[S]) {
                    g[S] = cost; V0=v;
                    f[S][v] = f[S^(1<<(v-1))][u] + 1;
                }
            }
        }
    //处理剩下的f  
    if(V0) //!!
        for(int i=1; i<=N; i++) {
            if((i!=V0) && (S&(1<<(i-1)))) 
                f[S][i] = f[S^(1<<(V0-1))][i];
        }
    return g[S];
}

最开始没有写那个if(V0),样例都过不了,调试了半个小时才发现……于是测了下大样例,过了?!好的这题我A了!(flag)

看T3,好像链的情况可以splay暴力搞……splay怎么打?我考前好像根本没打过啊……

……

想用__gnu_pbds::treestd::rope混分,最后都因为忘了怎么用而GG。

还有5分钟的时候交了个暴力上去。

结束考试的时候我跟兄弟学校的同学说T2我A了,然而出场之后被学长指出,我改了的DP方程还是不满足无后效性……

学长跟上一届的另一位神犇说,我看成贪心了。

期望得分60+100+60+100+30+20=370。当时我就觉得我可能要回去高考了。

考后

考完回去的车上,我想起班主任说我应该参加期中考试。拿出1个月都没有碰过的生物教材帮,想试着速成遗传定律。看书的时候,我听到旁边某学长说T3正解树状数组。挺难过的,因为从来没想到树状数组除了求和和优化DP之外还有这种用途。

到家已经晚上8点了,11点听说代码出来了,打开源代码文件夹准备测民间数据的时候,我的手在发抖。把代码找到的时候,我已经紧张到完全无法控制了。转身离开电脑,平复心情,再测。50……80……10……100……100……30……为什么我混过了day2T2的民间数据?不管了,官方数据应该不弱,退役应该稳了。

期中考试成绩出来了,考的自己还比较满意,停课这么久,没掉出年级前十。

成绩出来的那天,我偷偷拿班上的授课宝登qq看成绩。什么?60+80+60+100+100+30?这样的分数还有全省第四?难道大家都……想到那些比我付出的更多的同学考砸了,我心里就不是滋味。

后记

不管怎么样,NOIP2017都已经过去了,如果把它看成一个阶段性测试,那测试也结束了。更大的考验还在后面。既然有了继续奋斗的机会,就得抓住机会不断前行。不管怎么样,就算会的东西再少,WC2018也要尽力拿分。而且,距离省选也不久了,NOI也只有半年了,得赶快把各种算法和数据结构学清楚,然后开始加紧练习了。今年集训队的一位雅礼的dalao跟我说要好好刷BZOJ,vfk也说要多找找题练一练,同时要有自己的收获。希望能达到自己的目标,拿到Au吧。

又及:感谢班上那些支持过我的老师和同学,毕竟理解支持一个和你们道路不大一样的人本身就是个有难度的事情啊。