CF1699E题解

对于极差,一般思路是固定最小值,然后去找最大值的最小值。

有一个比较显然的性质:相同的数可以执行相同的操作,这样可以看作各个数互不相同。

考虑动态规划:\(f[i][j]\) 表示只考虑 \(j\) 这个数,把它分解成若干个大于等于 \(i\) 的因数,其最大值的最小值是多少。

\[\left\{ \begin{matrix} \begin{aligned} \\& f[i][j]=f[i+1][j] &i \nmid j\\& f[i][j]=\min(f[i][j],f[i][j/i]) & i\mid j\\& \end{aligned} \end{matrix} \right. \]

发现第一维可以省掉,相当于直接继承 \(f[i+1]\),而第二维通过调和级数,总数量为 \(\mathcal{O}(m\log m)\),而第二个转移要求在 \(i\) 这一层已经算过的,需要从小到大枚举。

相当于 \(f[j]\) 在不停变化,我们要动态维护最大值。

注意到当 \(i\) 减少时,这个最大值是不增的,这启发我们考虑双指针

什么时候右端点移动呢?因为 \(dp\) 的值域较小,我们用桶记录每个 \(dp\) 值出现次数,当右端点的桶空的时候,右端点左移。

posted on 2022-11-06 17:05  cool_tyl  阅读(5)  评论(0)    收藏  举报