【NOI2020游记】NOI如何拿到部分分(详细揭秘)
作者:互联网
背景
省选day1T1爆零的情况下意外混进了省队(D类)。
做了往年的题,感觉自己实力确实不太够。比如说,2018年的签到题(kruskal重构树)和2019年的签到题(斜率优化),凭我自己的能力都无法做出(“思维”和“算法的积累”两方面来讲,都是题目难度>我的水平)。
2016和2017年的题,我倒是能做出一两道(比如2016的Day2T1“区间”和2017Day1T2的蚯蚓排队),但是也有签到题我做不出来(比如2016的Day1T1“优秀的拆分”我只会90分;2017的Day2T1“游戏”我只想到先\(3^d\)枚举再2-SAT,看了题解才知道可以优化为先\(2^d\)再2-SAT)。
上述列举的这些都是当年的“签到题”,更不必说更难的题了,我只能打打暴力。
事实上,按照往年的情况,如果做出了这些签到题,暴力不挂分的话,就能拿到银牌了。不过坏消息是签到题似乎一年比一年难了...
Day-1(8.16),Day0(8.17),大家都在一起快乐狼人杀。然后都被李曙查水表了。
试机的题是:NOI2019 Day1T2机器人,NOI2019 Day1T3 序列,NOI2019 Day2T3 I君的商店。
试机后,大家聊天的句式都是:“哎,明天会不会要考xxx啊,如果考xxx我就没了啊...。我没了啊...”。其中“xxx”可以是任何一种我听都没听过的算法,可能已经远高于历年NOI的难度了,我不知道大家为什么都要这么说...。是为了搞别人心态吗?还是为了显示自己听过别人不知道的算法呢?
哎,可能大家只是习惯性地假...
晚上李曙给我嘱咐了几句:两天都会各有一道签到题,争取拿到70分。剩下的题每道题打30分暴力。每天130分,就能稳拿Ag了。
正好我的目标也是拿到Ag。所以对这番分析深以为然。
Day1
\(50+32+40=122\)
昨晚10点就睡了,半夜4:19醒了一次,又睡到6:40自然醒起床。可以说睡眠是很充足的,考试时精神也很好。上午考试前李曙给我们拍了个合照,本来我和djq站在一起,然后李曙一波安排,我就和dxm换了位置(你品,你细品 /滑稽)。
本着先在签到题拿高分的想法,我先看T1。是个图论题,而且没什么想法(我好像经常对图论题毫无思路...,无论这题本身是什么难度...)。我想是不是以1为根,搜出dfs树,然后看有没有环?然后对环做背包?看上去很奇怪,于是先看T2。
T2虽然题面很长,但看下来倒是觉得非常自然,也很好懂。看到前几个点\(m\)很小,一下就能想到做容斥。我粗略地以为时间复杂度是\(O(2^m\cdot \text{poly}(m))\),然后以为自己能拿到40分。然后就继续去看T3了。此时时间大概是8:18。
T3是个“很多维数点”...。看起来是个数据结构题。\(O(nm\log n)\)是很简单的(考完后听别人一说才想到,做个二维前缀和就变成\(O(nm)\)了。不过得分是一样的,所以也不重要,只是体现了我智商很低...)。部分分A(\(c_1=1,c_2=n\)),我想了想,离线?树套树?分治?貌似都不对。好像可以莫队,不过是\(O((n+m)\sqrt{n}\log {n})\)的,不知道能不能过\(10^5\)...。没太多想,就先去写T2暴力了。
先写了个\(O(2^n)\)暴力。因为后面不管些什么都可以用它拍。写完这个9:06。然后继续写“\(O(2^m\cdot \text{poly}(m))\)暴力”。发现自己一开始想错了,这个暴力并不是\(O(2^m\cdot \text{poly}(m))\)而是\(O(2^m\cdot n)\)。可能只能拿20分,这就要低于李曙给我定的计划了。于是又进一步想想,发现可以用树链剖分优化到\(O(2^mm\log^2n)\),期望拿到32分。虽然比之前以为的40分低了一些,但还是达到了李曙说的30分。
T2似乎后面还能再搞一个树形DP:\(dp[i][j]\)表示第\(i\)个点向上的前\(j\)条边里必须至少有一个重要边。我不太清楚它是\(O(n^2)\)还是\(O(n^3)\)的,不过应该还能再拿到一些分。但是看分不多我又不是很确定,就先没写这个。决定稳妥一点,先写T1,T3暴力,最后再写这个DP。此时9:52(毕竟写树链剖分还是要花不少时间的)。
再看T1,首先发现我原来那个“找出所有环然后做背包”的思路彻底假了,因为环的数量可以是指数级的。不过很快惊喜地发现可以直接在图上做DP:设\(dp[i][j]\)表示第\(i\)天到达节点\(j\),能获得的最大收益。转移直接枚举出边即可。时间复杂度\(O(T(n+m))\)。可以得到40分。然后又发现下面两点:图是一个环的部分分很简单,于是写了。
现在是10:44,T1总共有50分。感觉不错,先去上了个厕所。此时想到,\(T\)这么大,应该是矩阵快速幂。不过10秒钟后,我把自己否决了。我在草稿纸上写下:矩阵快速幂(x):max不能矩乘
。考完试才知道是我naive了。哎,完美地记录了我的无知...
虽然T1没拿到预期的70分,不过我看没有除快速幂外的其他思路,就没有继续纠结,转而去写T3部分分。\(O(nm\log n)\)的部分分就是用树状数组维护,非常好写。部分分A,我思考以后发现分治、树套树,这些似乎都不靠谱,于是尝试去写sqrt log的莫队。写完以后一测大样例,没过!我又对拍了小数据,才发现是我树状数组写错了。简而言之就是,改变了不该改变的参数,偷懒没有使用替身变量导致的错误(都是平时习惯不好,如果函数都写const int&
就没这个问题了)。又自己造了一组\(10^5,2\times10^5\)的随机数据,实测3.2s左右,感觉能过(下午查分发现只跑了1.8s)。
搞完这些,已经12:15了。这时候我发现一个大问题,T1的对拍的时候,因为一些不熟悉linux系统而导致的错误,我的程序其实没拍上...。修正了这个错误后,我重新对拍了T1,T2。T2过拍了。T1却没有过。(一开始搞错了,以为两个都没有过。反正那2分钟还挺刺激的)。好在发现T1是个小错误,改了就好了。
12:40左右试图开始写T2的树形DP部分分。但是时间不够了,没写完。最后就检查了一下文件啥的,提交提交,就结束了。
嗯。整个过程大概就是这样了。虽然分比同学低不少,但是没有挂分。又想到我的同学都是集训队水平,所以我感觉,也还行?然后李曙又笑嘻嘻地说不错不错(虽然他和谁都这么说),所以我还挺开心的。
总结反思?还没细想,以后再更吧。
标签:...,NOI,签到,T2,40,T1,NOI2020,揭秘,暴力 来源: https://www.cnblogs.com/dysyn1314/p/13525041.html