1 条题解
-
0
自动搬运
来自洛谷,原作者为

Error_Yuan
**搬运于
2025-08-24 22:43:14,当前版本为作者最后更新于2022-11-11 21:33:05,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
T4 题解:
观察题意得,我们对序列 做前缀异或和得到 后,每次操作相当于交换 和 。
(不失一般性,以下全部假设 , 时是相反的)
至多 个 在 为偶数时相当于把 中的 分成 段,每段的 都是连续的( 时是把 分成 段)。则我们可以写出如下 dp 转移:
- 设 表示 中的 分成 段的最小操作次数;
- $dp_{l,r,i}=\min_{l\le j<r}(dp_{l,j,i-1}+cost_{j+1,r})$,其中 表示将 中的 移动到同一段的最小操作次数。
- 可以通过平凡的贪心计算。
算法一
暴力转移,时间复杂度 ,预期通过测试点 ,然而由于常数极小,实际上可以通过测试点 。
- 鲜花:这个 到底是怎么做到 只需要 的??,就算乘上 的常数也有 ,怎么在 内跑过去的???
算法二
进行优化:感性理解一下, 满足四边形不等式,因此可以用四边形不等式优化,复杂度降至 。
注意:此处的四边形不等式优化和 [IOI 2000] 邮局 所用并不相同。
可以通过前 个测试点。
算法三
- 继续优化:我们记矩阵 ${\bf{A}}_{ij}=\begin{cases} cost_{i,j} & \text{ if } i\le j\\ 0 & \text{ otherwise } \end{cases}$,则每次 上的转移相当于对 做一次 的矩阵乘法, 次后 dp 矩阵即为 ,所以用矩阵快速幂即可 。请注意,经过算法二中的优化后这里的矩阵乘法是 的。 实现需要注意细节,很容易挂。
一个细节:这里矩阵乘法的形式是:
这里中间的 断开了,不一定能够满足乘法结合律,直接做快速幂会挂。我们可以这样重新定义矩阵乘法:
这样的话,设 ${\bf A'}_{ij}=\begin{cases} {\bf A}_{i-1,j} & \text{ if } i\le n\\ 0 & \text{ otherwise } \end{cases}$
这样 也满足四边形不等式,而原来的 等于现在的 ,这样就可以直接快速幂了。
对于询问,分类讨论一下即可做到单次 ,具体如下:
- 若 是偶数,答案显然为 。
- 若 是奇数,则答案为 $\min_{l\le j\le r} (dp_{l,j,\frac{k-1}{2}}+cost2_{j+1,r}))$,其中 表示 中的 在均移动到末尾(即 )处的最小操作数,这个也可以通过四边形不等式优化在 内预处理。
附一些细节:
- 不要将
matrix类型传入函数,很慢。 - 如果用了矩阵赋值,记得重载
=。
鲜花:本题赛时最高得分为 ,似乎大家都没有想到题解的第一句话。。。
得分为 应该是写了错误的贪心。
- 1
信息
- ID
- 8152
- 时间
- 4000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者