NOIP2024 游记

jinqihao2023

2024-11-30 17:22:14

生活·游记

Day0

感觉晚上头有点晕,duel 了一个 1310E 就去睡觉了,用了 50min,感觉脑子还算能用?

Day1

早上 8:00 集合。

8:30 发题,看大样例,发现一个都看不懂,切系统,打开 pdf,先通读了一遍,发现两个 10^9+7,感觉优势在我。

先看 T1,不是我怎么不会 T1 啊?一开始还尝试找结构直接算,后来发现不需要,注意到从前往后能匹配就匹配一定是最优的,于是直接做就好了,但是我糖了一下,不知道怎么实现,最后咬咬牙写了个 set,看起来跑的不慢,15min 扔了。

看 T2,看完就会了,大概画了一下计算细节,直接用 map 存位置,然后就做完了,大概也是 15min。

然后看 T3,想了一下发现大概就是,每个点旁边形成一个完全图,而一个完全图想要合法必须要形成一条链,那么就有了一个基本结构,但是具体的做法感觉有些细节,就先跳了,看看 T4 再说,大概用了 30min。

看到 T4 感觉很典,但是我又不是很会,于是就先试试套路的想法,试了一下直接扫描线,然后转成矩形加,但是查询的形式非常阴间,是斜线查询,这个之前模拟赛的时候想了很久不会做,那么感觉思路就不是这样的。

于是想别的方向,尝试考虑每个点对答案的贡献,那么就想到了 dsu on tree,直接维护每个点子树内在原序列上的存在性,然后每次加入的时候二分两次找到极长区间,这样就可以找出 O(n\log n) 个极长区间,但是最后的计算部分是一个三维偏序的问题(这里我若至了,其实只需要二维),至少需要 O((n+q)\log^2n),拼一起就是 O(n\log^3n),肯定过不了(其实现在比较庆幸当时没有想到实际上是二维偏序,要不然的话 dsu+ 线段树的 2log 肯定是过不了的)。

那么怎么办呢,我又想了一段时间,发现我忘记了一开始的单调栈的想法,事实上我只需要用单调栈就可以把极长区间数量降到 O(n),那么就是 O(n\log^2n),感觉很有希望,稍微确认了一下做法正确性我就开始写这题,大概在 2h30min 的时候通过了大样例,1.6s,感觉应该能过。

于是我开始看 T3,还有 2h,而且已经有了思路,所以心态非常好,一开始的状态设计复杂了,常数也很大,而且需要分讨若干情况,后来发现状态大概是 6n 的,加上转移运算次数大概是 24n,感觉也不是很难写,于是直接开始写,写了大概一个小时过了大样例,感觉运气很好,过了小样例就过了,如果没有过的话我真的不知道该怎么调。

于是最后 40min 大概检查了一下文件和做法,给 T4 上了个拍,然后瞪了一下 T1 的贪心,感觉没有什么问题就结束了。

应该是 ak 了?