1 条题解
-
0
关键观察
- 交换规则的本质 交换只在 (1, 0) 的情况下发生,并且交换后变成 (0, 1),相当于 1 向左移动(如果 则 1 向右移动,但题目没说位置大小关系,所以是双向的)。
这实际上定义了一个有向图:如果存在命令 ,则有一条从 到 的边,表示当 为 1 且 为 0 时,1 可以从 移动到 。
-
可达性 我们可以定义可达关系:如果从位置 可以通过一系列命令移动到位置 ,则 能到达 。 注意:移动的条件是路径上的每一步都满足“当前是 1,目标是 0”,但在最终状态中,我们关心的是所有 1 能否聚集到一起。
-
最终连续 1 的区间位置 假设最终连续 1 的区间是 ,长度为 。 那么初始时所有最终会落在 的 1 必须能到达这个区间内的某个位置,并且区间外的位置最终不能有 1。
图论建模
我们可以建立图 ,顶点是位置 ,对于每个命令 ,添加有向边 和 (因为交换是双向的,只是有条件限制,但在可达性分析中,我们关心的是能否通过若干步把 1 从某位置移到另一位置,这需要路径上每一步的目标在移动前是 0,但在统计时我们考虑的是所有可能的 0/1 分布,所以在某种初始状态下,1 可以沿边移动当且仅当目标初始为 0,但我们要对所有初始状态计数,所以必须考虑所有可能的移动路径)。
更准确地说: 定义传递闭包:如果存在一条路径 ,并且存在某种 0/1 初始分配,使得沿着这条路径可以一步步把 1 从 移动到 ,那么 能到达 。 实际上,只要路径上的点 在初始时可以是 0,就能移动。因为我们是对所有初始状态计数,所以只要路径上除了起点和终点外没有其他限制(因为我们可以设它们为 0),那么这条路径就是“可能可用的”。
因此,在计算可达性时,我们直接求原图(双向边)的连通分量,因为如果 和 在同一个连通分量中,那么可以通过一系列交换把 1 从 移到 (通过设置中间节点为 0)。
算法思路
建图:对于每个命令 ,添加无向边 (因为命令是双向的,只是有条件限制,但连通性上是无向的)。
求连通分量。
对于每个 ,我们要统计:有多少个大小为 的初始 1 集合 ,使得执行命令后,这些 1 能形成一个连续区间。
关键结论(已知解法): 最终 1 的连续区间 对应某个连通分量的子集。 更具体地,最终状态中,所有 1 会聚集到某个连通分量的一些连续位置上(在原始编号顺序上连续)。
对 2 取模时,可以用线性代数或集合幂级数的方法,利用 上的组合数学。
实现方法
标准解法:
用 Floyd 或 BFS 求原图的可达性(作为无向图则求连通分量)。
对每个初始 1 的集合 ,定义 = 1 当且仅当执行命令后,这些 1 能形成一个连续区间。
我们要求 。
利用 meet-in-the-middle 或 DP over subsets 在 时间内计算(因为 )。
- 1
信息
- ID
- 3738
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者