动态规划
显然有 \(n^3\) 的 dp。
设 \(f_{i,j}\) 表示前 \(i\) 个数里划分 \(j\) 段(\(i\) 为第 \(j\) 段结尾)的方案数,\(s_i=\sum_{i=1}^ia_i\),则有:
考虑进一步优化。
我们发现上式可以化为:
优化转移,令 \(g_{i,j}=\sum_{s_k\equiv j\pmod i}f_{k,i-1}\)。
则有
考虑设计 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。
考虑优化。
发现 \(cnt_i\) 可以用狄利克雷后缀和来解决,复杂度 \(\mathcal O(n\ln \ln n)\)。
发现 \(f\) 的转移太慢了。
考虑贪心,发现若 \(\dfrac{j}{i} \in \text{prime}\) 转移一定是最优的。
时间复杂度为 \(\mathcal O(n\ln \ln n)\),可以通过 D2。
考虑记 \(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\)。
记录方案并输出即可。
考虑 \(\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\) 的区间。