1 条题解

  • 0
    @ 2025-8-24 22:38:51

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 周子衡
    Shadow is the light!

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

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

    以下是正文


    • 题意: 给定 n×nn\times n 正整数方阵 AA,保证 1n21\sim n^2 的每个正整数都在其中出现过。你每次可以交换 AA 中同行 / 同列的两个元素。你需要用尽可能少的交换次数将 AA 变为另一个方阵 BB,其中 Bi,j=(i1)×n+jB_{i,j}=(i-1)\times n+j,并构造一组方案。
    • 由于本题找到最优解十分困难,你的方案步数只要不超过一定范围即可。具体地,设 k(C)k(C) 表示把某个 n×nn\times n 方阵 CC 变为 BB 的最小步数,记 k0k_0 为在全部的 CC 中,k(C)k(C) 的最大值。你只需要构造出一种不超过 k0k_0 步的方案即可通过。
    • n1000n\leq 1000

    好题。

    我们先来试着确定一下 k0k_0 的值。很容易观察到 n21k02n2n^2-1 \leq k_0\leq 2n^2,也就是说 k0k_0n2n^2 是同阶的。到底在 n2n^2 附近还是 2n22n^2 附近呢?或者都不是?通过直觉(或者是实验),可以猜想应该在 2n22n^2 附近。读者可以来试着自己证明一下。


    我们先来说明 k02(n2n)k_0\geq 2(n^2-n)

    考虑构造两张有向图 R,CR,C。对 AA 中的每个元素,我们在 RR 中从它所在的行向它应该在的行连一条边;在 CC 中从它所在的列向它应该在的列连一条边。可以知道,RRCC 都是欧拉图。对欧拉图 GG,定义 cyc(G)\mathrm{cyc}(G) 表示能将 GG 拆分出的最大环数。可以发现,cyc\mathrm{cyc} 的最小值为 nn,最大值为 n2n^2,且操作结束时 R,CR,Ccyc\mathrm{cyc} 值都会达到 n2n^2;一次操作只会对 R,CR,C 中的某一个有影响,且对有影响的那个图,它的 cyc\mathrm{cyc} 值至多只会变化 11。我们只需要说明存在某个 AA 使得开始的时候 R,CR,Ccyc\mathrm{cyc} 值都只有 nn,就可以说明 k02(n2n)k_0\geq 2(n^2-n)。这是简单的:把目标方阵循环下移一格再循环右移一个,得到的方阵就满足条件。

    (“最大环数”这个概念在这里也有出现过,读者可以比较一下。)


    好的,接下来我们将构造地证明:对任意方阵 AA,都存在 2(n2n)2(n^2-n) 步的复原方式,从而解决本题。

    考虑一行一行地复原。首先可以知道:任意时刻我们都可以在 22 步之内把某个元素还原到它应在的位置上。同时,当前 n1n-1 行都复原时,复原最后一行至多需要 n1n-1 次操作。计算一下可以发现,只要我们复原除了最后一行的某一行时能少用 11 次操作,我们就解决了这题。

    当复原某一行时,我们只看应该出现在这一行的所有元素。对每个该行元素,从它在的列向它应在的列连一条边,形成一张有向图。这个有向图每个点都有一条入边,则必有一个环。找到这个环,设环长为 cc,我们先用至多 cc 次操作把这 cc 个点对应的元素都转移到该行上,然后再在行内用 c1c-1 次操作复原这 cc 个元素。剩下的元素每个 22 次复原即可。

    关于实现细节:本题要求 O(n2)O(n^2) 的时间复杂度,可以在操作的同时维护每个元素所在的位置。注意常数。

    后记

    这题题解鸽了挺久的,谢罪 QaQ

    以及,代码就鸽掉了 QaQ

    • 1

    信息

    ID
    7773
    时间
    2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者