「KDOI-03」序列变换 题解
Error_Yuan · · 题解
T4 题解:
观察题意得,我们对序列
(不失一般性,以下全部假设
至多
- 设
dp_{l,r,i} 表示s_{[l,r]} 中的1 分成i 段的最小操作次数; -
-
算法一
暴力转移,时间复杂度
- 鲜花:这个
O(n^3k) 到底是怎么做到400 只需要3s 的??400^3\times300=1.92\times10^{11} ,就算乘上\frac{1}{16} 的常数也有10^{10} ,怎么在4s 内跑过去的???
算法二
进行优化:感性理解一下,
注意:此处的四边形不等式优化和 [IOI 2000] 邮局 所用并不相同。
可以通过前
算法三
- 继续优化:我们记矩阵
{\bf{A}}_{ij}=\begin{cases} cost_{i,j} & \text{ if } i\le j\\ 0 & \text{ otherwise } \end{cases} ,则每次i 上的转移相当于对\bf{A} 做一次(\min,+) 的矩阵乘法,\dfrac{k}{2} 次后 dp 矩阵即为{\bf{A}}^{\frac{k}{2}} ,所以用矩阵快速幂即可O(n^2\log k) 。请注意,经过算法二中的优化后这里的矩阵乘法是\bm{O(n^2)} 的。 实现需要注意细节,很容易挂。
一个细节:这里矩阵乘法的形式是:
这里中间的
这样的话,设
这样
对于询问,分类讨论一下即可做到单次
- 若
k 是偶数,答案显然为dp_{l,r,\frac{k}{2}} 。 - 若
k 是奇数,则答案为\min_{l\le j\le r} (dp_{l,j,\frac{k-1}{2}}+cost2_{j+1,r})) ,其中cost2_{i,j} 表示s_{[i,j]} 中的1 在均移动到末尾(即j )处的最小操作数,这个也可以通过四边形不等式优化在O(n^2) 内预处理。
附一些细节:
- 不要将
matrix类型传入函数,很慢。 - 如果用了矩阵赋值,记得重载
=。
鲜花:本题赛时最高得分为
得分为