「KDOI-03」序列变换 题解

· · 题解

T4 题解:

观察题意得,我们对序列 a 做前缀异或和得到 s 后,每次操作相当于交换 s_is_{i-1}

(不失一般性,以下全部假设 s_{L-1}=0s_{L-1}=1 时是相反的)

至多 k1k 为偶数时相当于把 s_{[L,R]} 中的 1 分成 \dfrac{k}{2} 段,每段的 1 都是连续的(s_{L-1}=1 时是把 0 分成 \dfrac{k}{2} 段)。则我们可以写出如下 dp 转移:

算法一

暴力转移,时间复杂度 O(n^3k),预期通过测试点 1\sim10,然而由于常数极小,实际上可以通过测试点 1\sim14

算法二

进行优化:感性理解一下,cost 满足四边形不等式,因此可以用四边形不等式优化,复杂度降至 O(n^2k)

注意:此处的四边形不等式优化和 [IOI 2000] 邮局 所用并不相同。

可以通过前 17 个测试点。

算法三

一个细节:这里矩阵乘法的形式是:

C_{i,j}=\min(A_{i,k}+B_{k+1,j})

这里中间的 k 断开了,不一定能够满足乘法结合律,直接做快速幂会挂。我们可以这样重新定义矩阵乘法:

C_{i,j}=\min(A_{i,k}+B_{k,j})

这样的话,设 {\bf A'}_{ij}=\begin{cases} {\bf A}_{i-1,j} & \text{ if } i\le n\\ 0 & \text{ otherwise } \end{cases}

这样 \bf A' 也满足四边形不等式,而原来的 {\bf A}^{\frac{k}{2}} 等于现在的 {\bf A}\times{\bf (A')}^{\frac{k}{2}-1},这样就可以直接快速幂了。

对于询问,分类讨论一下即可做到单次 O(1),具体如下:

附一些细节:

鲜花:本题赛时最高得分为 36,似乎大家都没有想到题解的第一句话。。。

得分为 28/32/36 应该是写了错误的贪心。