2022.06.30 NOI模拟赛总结
1.时间安排
7:30~7:50 看题面
T1:比较复杂的DP题,有20分没问号的 \(n^2\) DP 比较直观,还有30分的 \(n^2\) DP可以试一试。
T2:字符串题,不太擅长,有30分暴力,可以试试想 \(n^2log\) 的做法。
T3:数据结构题,但感觉本质还是DP,有35分比较显然可以拿,还有25分没修改操作可以试试。
7:50~8:30
先开T3。
可以直接分块+unordered_map做第一个子任务,写完常数大到跑了6s左右,改成暴力sort居然2s就跑完了。
然后写了个 \(n^2\) DP拿暴力分。
想了一会怎么做无修改,没思路。
8:30~9:00
T2先写了个 \(n^4\) 的暴力,因为多测改成了 \(n^3\) 的hash,思考一会没想法直接跳T1。
9:00~12:00
先把T1的20分写了,发现转移和T3的方程很像,想着能想出来优化也许能直接把两个题都写一档分,想了半个多小时左右没结果。
然后试着推有问号的 \(n^2\) 转移方程,打出来重复了很多。
试了很多方法去掉重复状态,没什么用。
一直调到结束也没调出来。
result:
T1:20 T2:20(细节挂了10分) T3:20(暴力写成 \(n^2q\) 了……)
2.总结
T1:
第一步的递推式就很复杂,还没弄懂,后面的dp套dp也没学,待补。
T2:
字符串好题。
既然答案是子串,不妨建出来后缀自动机(考试时根本没往SAM上想),可以发现对于同一条树链的endpos集合,覆盖原串的长度是随子串的长度递减而递增的(小结论),所以可以先启发式合并求出endpos集合,再二分出最短的恰好覆盖K个位置的字符串,然后用二分+hash或者后缀数组更新最优答案即可,时间复杂度是 \(O(n^2log)\),为二分的次数 \(O(nlog)\) 和一次check的时间 \(O(n)\)。
因为二分次数不容易降,所以考虑降低check的时间复杂度。
把endpos集合提出来,往前延伸len个位置,这些块间会有重叠,我们视为多干个连通块,可以发现连通块由第一个完整块和后面的两点间间隙组成,考虑分别维护。
因为随着siz的增加,间隙的个数只增不减,所以可以看做一个后缀加的形式,可以用树状数组或线段树维护,第一个完整块的个数可以由全部减去间隙块的个数求得,类似前者维护。
这样check的时间复杂度就降到了 \(O(log)\) ,整体复杂度为 \(O(nlog^2)\)。
因为瓶颈不在于后缀数组,所以偷懒写了二分+hash,不过后缀数组还是要抽时间复习一下。
T3:
((C)语言丁真,鉴定为:纯纯的暴力)
正解真的好暴力啊……
自己在考场上的第一档做法很接近正解(的其中一部分)(多的一个log标程用了bitset,不过似乎常数更大?(n/64<logn,乐))。
正解就是暴力从0增广,每次选择最小的增广区间,出题人用一整页pdf证明了增广次数不超过 \(k*2^k\) (感性理解很对)。
然后就做完了?
神秘题。

浙公网安备 33010602011771号