1 条题解

  • 0
    @ 2026-9-3 10:58:39

    题解

    思路

    把移动方案化为边覆盖

    任意最终方案对应一个没有不动点的排列。对链上任意一条边,跨过它向左移动的芯片数必等于向右移动的芯片数,因此这条边对总代价的贡献一定是其边权的偶数倍。

    考虑排列中每个环所覆盖的最小连续区间。沿该区间的每条边至少要各向两个方向跨越一次;反过来,对若干条边组成的集合,只要链上每个顶点都至少与一条被选边相邻,就能把每个被选边连通块中的顶点循环移动,总代价恰为被选边权和的两倍。

    所以问题等价于:在链的 n−1n-1 条边中选择一个最小权边覆盖,使每个顶点至少与一条被选边相邻。答案为所选边权和的两倍。特别地,第一条和最后一条边必须被选,且不能出现两条相邻边都未选。

    做法

    三个算法层级

    子任务 1:枚举边集

    修改后枚举全部 2n−12^{n-1} 个边集,检查首尾边是否选中、是否存在相邻未选边,取合法集合的最小权值和。复杂度 O(qn2n)O(qn2^n)。

    子任务 2:每次线性动态规划

    令 dpi(0/1)dp_i(0/1) 为处理到第 ii 条边,且第 ii 条边不选或选择时的最小权值和。第一条边必须选择:

    dp1(0)=+∞,dp1(1)=a1.dp_1(0)=+\infty,\qquad dp_1(1)=a_1.

    转移为

    dpi(0)=dpi−1(1),dp_i(0)=dp_{i-1}(1), dpi(1)=min⁡(dpi−1(0),dpi−1(1))+ai.dp_i(1)=\min(dp_{i-1}(0),dp_{i-1}(1))+a_i.

    最后一条边也必须选择,答案为 2dpn−1(1)2dp_{n-1}(1)。每次修改后重算,复杂度 O(nq)O(nq)。

    子任务 3:线段树维护边界状态

    对任意连续边段维护 fxyf_{xy}:在段内不存在相邻未选边、并且左右端边的选择状态分别为 x,yx,y 时,段内所选边的最小权值和。

    单条权值为 ww 的边只有

    f00=0,f11=wf_{00}=0,\qquad f_{11}=w

    两个有限状态。合并左右两段时枚举左段右端状态 jj 和右段左端状态 kk;若 j=k=0j=k=0,中间顶点未被覆盖,不能合并,否则更新

    fix=min⁡(fix,Lij+Rkx).f_{ix}=\min(f_{ix},L_{ij}+R_{kx}).

    根节点的 f11f_{11} 强制首尾边均被选,故每次答案为 2f112f_{11}。单点修改和查询根状态均为 O(log⁡n)O(\log n),总复杂度 O((n+q)log⁡n)O((n+q)\log n),空间复杂度 O(n)O(n)。

    所有代价必须使用 64 位整数。

    复杂度

    三个子任务算法的时间复杂度分别为 O(qn2n)O(qn2^n)、O(nq)O(nq) 和 O((n+q)log⁡n)O((n+q)\log n);满分算法空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    1377
    时间
    3000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者