1 条题解

  • 0
    @ 2025-8-24 22:43:14

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Error_Yuan
    **

    搬运于2025-08-24 22:43:14,当前版本为作者最后更新于2022-11-11 21:33:05,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    T4 题解:

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

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

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

    • dpl,r,idp_{l,r,i} 表示 s[l,r]s_{[l,r]} 中的 11 分成 ii 段的最小操作次数;
    • $dp_{l,r,i}=\min_{l\le j<r}(dp_{l,j,i-1}+cost_{j+1,r})$,其中 costi,jcost_{i,j} 表示将 si,js_{i,j} 中的 11 移动到同一段的最小操作次数。
    • costi,jcost_{i,j} 可以通过平凡的贪心计算。

    算法一

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

    • 鲜花:这个 O(n3k)O(n^3k) 到底是怎么做到 400400 只需要 3s3s 的??4003×300=1.92×1011400^3\times300=1.92\times10^{11},就算乘上 116\frac{1}{16} 的常数也有 101010^{10},怎么在 4s4s 内跑过去的???

    算法二

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

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

    可以通过前 1717 个测试点。

    算法三

    • 继续优化:我们记矩阵 ${\bf{A}}_{ij}=\begin{cases} cost_{i,j} & \text{ if } i\le j\\ 0 & \text{ otherwise } \end{cases}$,则每次 ii 上的转移相当于对 A\bf{A} 做一次 (min,+)(\min,+) 的矩阵乘法,k2\dfrac{k}{2} 次后 dp 矩阵即为 Ak2{\bf{A}}^{\frac{k}{2}},所以用矩阵快速幂即可 O(n2logk)O(n^2\log k)请注意,经过算法二中的优化后这里的矩阵乘法是 O(n2)\bm{O(n^2)} 的。 实现需要注意细节,很容易挂。

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

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

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

    Ci,j=min(Ai,k+Bk,j)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}$

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

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

    • kk 是偶数,答案显然为 dpl,r,k2dp_{l,r,\frac{k}{2}}
    • kk 是奇数,则答案为 $\min_{l\le j\le r} (dp_{l,j,\frac{k-1}{2}}+cost2_{j+1,r}))$,其中 cost2i,jcost2_{i,j} 表示 s[i,j]s_{[i,j]} 中的 11 在均移动到末尾(即 jj)处的最小操作数,这个也可以通过四边形不等式优化在 O(n2)O(n^2) 内预处理。

    附一些细节:

    • 不要将 matrix 类型传入函数,很慢。
    • 如果用了矩阵赋值,记得重载 =

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

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

    • 1

    信息

    ID
    8152
    时间
    4000ms
    内存
    1024MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者