动态规划

ABC207E Mod i

显然有 \(n^3\) 的 dp。

\(f_{i,j}\) 表示前 \(i\) 个数里划分 \(j\) 段(\(i\) 为第 \(j\) 段结尾)的方案数,\(s_i=\sum_{i=1}^ia_i\),则有:

\[f_{i,1}=1,f_{i,j}=\sum_{k=1}^{i-1}[s_i-s_k\equiv 0 \pmod j]f_{k,j-1} \]

考虑进一步优化。

我们发现上式可以化为:

\[f_{i,1}=1,f_{i,j}=\sum_{k=1}^{i-1}[s_i\equiv s_k \pmod j]f_{k,j-1} \]

优化转移,令 \(g_{i,j}=\sum_{s_k\equiv j\pmod i}f_{k,i-1}\)

则有

\[f_{i,1}=1,f_{i,j}=g_{j,s_i\bmod j} \]

Submission

D1 D2

CF1614D1 CF1614D2

考虑设计 DP。

\(f_i\) 表示目前 \(\gcd\)\(i\) 的最大 \(\gcd\) 和,记 \(cnt_i\) 表示 \(i\) 的倍数有多少个。

有转移 \(f_i=\max_{i|j}f_j+(cnt_i-cnt_j)i\)\(f_i\) 的初始值为 \(icnt_i\)

直接做是 \(\mathcal O(n\ln n)\) 的,可以通过 D1。

Sumission

考虑优化。

发现 \(cnt_i\) 可以用狄利克雷后缀和来解决,复杂度 \(\mathcal O(n\ln \ln n)\)

发现 \(f\) 的转移太慢了。

考虑贪心,发现若 \(\dfrac{j}{i} \in \text{prime}\) 转移一定是最优的。

时间复杂度为 \(\mathcal O(n\ln \ln n)\),可以通过 D2。

Sumission

Lanterns

考虑记 \(f_i\) 表示前 \(i\) 个灯能覆盖的最大前缀。

考虑向右:

  • 如果 \(f_{i-1}< i\),则有 \(f_i=f_i-1\)
  • 否则有 \(f_i=\max(f_{i-1},p_i+i)\)

考虑向左:

  • 找到最早的 \(j\) 满足 \(f_j\ge i-a_i-1\),则 \(f_j=\max_{j+1}^{i-1} a_i+i\),当然,如果 \(j<i-1\),则 \(f_j=i-1\)

最后判断是否有 \(f_n\ge n\)

记录方案并输出即可。

Submission

Wonderful Jump

考虑 \(\mathcal O(n^2)\) 的 dp。

则有 \(f_i = \min_{j=1}^{i-1} f_j + \min a_{i\sim j}(i-j)^2\)

考虑优化。

有两个性质:

  • 性质 \(1\):最小值总是出现在两端。

    Proof:如果 \(a_{1\sim n}\) 为选取的区间,最小值 \(a_{k}(2\le k\le n-1)\),则选取 \(a_{1\sim k}\)\(a_{k\sim n}\) 显然更优。

  • 性质 \(2\):一个以 \(a_i\) 为最小值的区间的长度不会超过 \(\dfrac{n}{a_i}\)

    Proof:显然,如果一个区间长度为 \(l\),则每次都选取相邻两数的代价不超过 \(nl\),一次选取所有的为 \(a_il^2\),若有 \(a_il^2<nl\),则 \(l<\dfrac{n}{a_i}\)

则我们令 \(B=\sqrt{n}\)

  • \(a_i\ge B\),则转移长度为 \(\mathcal O(B)\)
  • 否则有 \(a_i\) 的种类数不超过 \(\mathcal O(B)\),每种类不超过 \(\mathcal O(n)\) 的长度。

时间复杂度 \(\mathcal O(n\sqrt{n})\)

注意转移所有的长度为 \(1\) 的区间。

Submission

posted @ 2024-05-16 13:36  WhisperingWillow  阅读(20)  评论(0)    收藏  举报