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\) (感性理解很对)。

然后就做完了?

神秘题。

posted @ 2022-06-30 14:18  Displace  阅读(79)  评论(0)    收藏  举报