1 条题解

  • 0
    @ 2025-10-22 17:26:59

    关键观察

    1. 交换规则的本质 交换只在 (1, 0) 的情况下发生,并且交换后变成 (0, 1),相当于 1 向左移动(如果 ai<bia_i < b_i 则 1 向右移动,但题目没说位置大小关系,所以是双向的)。

    这实际上定义了一个有向图:如果存在命令 (a,b)(a,b),则有一条从 aabb 的边,表示当 aa 为 1 且 bb 为 0 时,1 可以从 aa 移动到 bb

    1. 可达性 我们可以定义可达关系:如果从位置 uu 可以通过一系列命令移动到位置 vv,则 uu 能到达 vv。 注意:移动的条件是路径上的每一步都满足“当前是 1,目标是 0”,但在最终状态中,我们关心的是所有 1 能否聚集到一起。

    2. 最终连续 1 的区间位置 假设最终连续 1 的区间是 [L,R][L, R],长度为 kk。 那么初始时所有最终会落在 [L,R][L, R] 的 1 必须能到达这个区间内的某个位置,并且区间外的位置最终不能有 1。

    图论建模

    我们可以建立图 GG,顶点是位置 1n1 \dots n,对于每个命令 (a,b)(a,b),添加有向边 aba \to bbab \to a(因为交换是双向的,只是有条件限制,但在可达性分析中,我们关心的是能否通过若干步把 1 从某位置移到另一位置,这需要路径上每一步的目标在移动前是 0,但在统计时我们考虑的是所有可能的 0/1 分布,所以在某种初始状态下,1 可以沿边移动当且仅当目标初始为 0,但我们要对所有初始状态计数,所以必须考虑所有可能的移动路径)。

    更准确地说: 定义传递闭包:如果存在一条路径 u=p0p1pt=vu = p_0 \to p_1 \to \dots \to p_t = v,并且存在某种 0/1 初始分配,使得沿着这条路径可以一步步把 1 从 uu 移动到 vv,那么 uu 能到达 vv。 实际上,只要路径上的点 p1,,pt1p_1, \dots, p_{t-1} 在初始时可以是 0,就能移动。因为我们是对所有初始状态计数,所以只要路径上除了起点和终点外没有其他限制(因为我们可以设它们为 0),那么这条路径就是“可能可用的”。

    因此,在计算可达性时,我们直接求原图(双向边)的连通分量,因为如果 uuvv 在同一个连通分量中,那么可以通过一系列交换把 1 从 uu 移到 vv(通过设置中间节点为 0)。

    算法思路

    建图:对于每个命令 (a,b)(a,b),添加无向边 aba-b(因为命令是双向的,只是有条件限制,但连通性上是无向的)。

    求连通分量。

    对于每个 kk,我们要统计:有多少个大小为 kk 的初始 1 集合 SS,使得执行命令后,这些 1 能形成一个连续区间。

    关键结论(已知解法): 最终 1 的连续区间 [L,R][L, R] 对应某个连通分量的子集。 更具体地,最终状态中,所有 1 会聚集到某个连通分量的一些连续位置上(在原始编号顺序上连续)。

    对 2 取模时,可以用线性代数或集合幂级数的方法,利用 F2\mathbb{F}_2 上的组合数学。

    实现方法

    标准解法:

    用 Floyd 或 BFS 求原图的可达性(作为无向图则求连通分量)。

    对每个初始 1 的集合 SS,定义 f(S)f(S) = 1 当且仅当执行命令后,这些 1 能形成一个连续区间。

    我们要求 ans[k]=S=kf(S)mod2ans[k] = \sum_{|S|=k} f(S) \bmod 2

    利用 meet-in-the-middle 或 DP over subsets 在 O(2n/2)O(2^{n/2}) 时间内计算(因为 n35n \le 35)。

    • 1

    信息

    ID
    3738
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者