CF1603D Artistic Partition

首先如果 \(2^k>n\),答案为 \(n\)

否则 \(k\le \log_2n\),然后就可以令 \(dp_{i,j}\) 表示前 \(i\) 个数分 \(j\) 段的最小答案。

\(dp_{i,j}=\min\limits_{k=1}^{i}\{dp_{k-1,j-1}+c(k,i)\}\)

考虑到:

\[\begin{aligned}c(l,r)=&\sum\limits_{i=l}^{r}\sum\limits_{j=l}^{r}[\gcd(i,j)\ge l]\\=&\sum\limits_{k=l}^{r}\sum\limits_{i=l}^{r}\sum\limits_{j=i}^{r}[\gcd(i,j)=k]\\=&\sum\limits_{k=l}^{r}\sum\limits_{i=1}^{r/k}\varphi(i)\\=&\sum\limits_{k=l}^{r}S_{\varphi}(\left\lfloor\frac{r}{k}\right\rfloor)\end{aligned} \]

我们发现它有决策单调性!

于是可以 \(O(n\sqrt n)\) 预处理 \(val_{i,j}\) 表示 \(r=i\) 并且 \(\left\lfloor\frac{n}{k}\right\rfloor=j\)\(\sum\limits_{k=l}^{r}S_{\varphi}(\left\lfloor\frac{r}{k}\right\rfloor)\) 的值(此时 \(l\) 为满足 \(\left\lfloor\frac{n}{l}\right\rfloor=\left\lfloor\frac{n}{r}\right\rfloor\) 最小的 \(l\))。

然后 \(c(l,r)=\sum\limits_{k=1}^{r/l-1}val_{r,i}+S_{\varphi}(\left\lfloor\frac{r}{l}\right\rfloor)(r'-l+1)\)\(r'\) 为使 \(\left\lfloor\frac{r}{r'}\right\rfloor=\left\lfloor\frac{r}{l}\right\rfloor\) 最大的 \(r\),可以 \(O(1)\) 求出。

于是可以在 \(O(n\sqrt n+n\log^2 n)\) 的复杂度内解决此题。

但我觉得预处理太麻烦了咋办?

我们发现,在移动区间左端点时,每向左移 \(1\) 位就对转移答案贡献 \(S_{\varphi}(\left\lfloor\frac{r}{l}\right\rfloor)\),而总移动次数不超过 \(O(n\log n)\) 次,我们可以在开始就暴力 \(O(\sqrt n)\) 算出 \(c(pr+1,mid)\) 的值,然后 \(l\) 指针从 \(pr\) 移到 \(pl\)(可转移的区间)的过程中加贡献即可。

由于对于每个 \(mid\) 仅算了一次 \(c(pr+1,mid)\),于是这部分应该是 \(O(n\sqrt n\log n)\) 的,整个 \(dp\) 过程应该是 \(O(n\sqrt n\log n+n\log^2 n)\) 的,但是不知道为啥能过(可能是因为每次计算 \(c(pr+1,mid)\) 区间长度远远达不到 \(n\)),如果有会证明时间复杂度的好哥哥可以打我(

posted @ 2023-07-20 17:13  Ender_32k  阅读(5)  评论(0编辑  收藏  举报