T20201117
T1
Subtask 1 & 2
\(O(nk)\) 的暴力,对于 \(f_m(n)\) 有: \[ f_m(n)= \begin{cases} f_m(n-1)&m\not\mid n\\ f_m(n-1)+f(\frac mn) &m\mid n \end{cases} \] 然后就暂时没有下文了
T2
还是暴力。。。
T3
做法
考虑分治,就是模拟归并排序的运算流程。
归并的思想,就是不断的把子区间变得有序,然后再来合并这些有序的子区间。
但是,利用归并的思想,还要考虑如何使用区间翻转操作合并两个区间。

然后又是两个子段的合并,所以合并也是一个 \(O(\log n)\) 的时间复杂度。
那么总时间复杂度就应该是 \(O(n\log ^2n)\) 的时间复杂度。
证明
感觉这其实也是算一种构造的,就是构造了一种排序的方式,似乎有些抽象。
考虑对于每一次的合并操作,最坏最坏的情况就是蓝色的操作刚好取到中点,然后合并黑色和绿色的区间递归下去的时候又是刚好取到中点,所以,这样的一个区间的花费就是 \(len\log len\),所以最后的总花费就应该是: \[ ans=\sum_{i=0}len_i\log len_i \] 然后把那个\(32000\) 带进去算,得到的答案竟然只有 \(3821617\),真的是远远小于 \(4\times10^6\),所以这个算法就是对的了。
Code
Code1 |
|
T4
广义后缀自动机模板题,不说了。。。