1 条题解

  • 0
    @ 2026-8-23 21:00:56

    题解

    思路

    把每个颜色独立考虑。由于操作颜色整体单调不降,一个格子持有某个颜色的时间至多形成一个连续区间。某一时刻的总连通块数,等于各颜色诱导子图的连通块数之和。

    对非零颜色 cc,所有变成 cc 的时刻集中在同一个连续操作段内;该段结束后只会有格子离开 cc,不会再有格子进入。因此,进入阶段可正向加点,离开阶段可倒序加点。颜色 00 没有进入阶段,只需倒序处理格子的首次改色。

    做法

    先扫描所有操作,为每个格子拆出若干三元组“颜色、开始时刻、结束时刻”。重复把同一格改为相同颜色不会产生新区间。

    对每种非零颜色,将其区间按开始时刻递增排序。用并查集依次激活格子:新点使分量数增加一,与每个已经激活的同色邻格成功合并时再减一,把该增量记到开始时刻。

    随后清空状态,把区间按结束时刻递减排序并再次加点。倒序加点的分量增量,正好是正序删除该点时分量数变化的相反数,因此把其相反数记到结束时刻。颜色 00 只做这一步。

    最后以初始全零矩阵的一个连通块为起点,对所有时刻增量求前缀和。

    子任务 1 可在每次修改后直接 BFS 整张矩阵。子任务 2 只有零色和一种新颜色,可分别用一次正向与一次逆向并查集扫描。

    复杂度

    设有效颜色区间总数为 Knm+qK\le nm+q。各颜色内排序的总复杂度为 O(KlogK)O(K\log K),并查集合并总复杂度为 O(Kα(nm))O(K\alpha(nm)),空间复杂度为 O(K+nm+q)O(K+nm+q)

    正确性证明

    固定颜色 cc。在正向进入阶段,并查集在每个开始时刻后恰好包含当时值为 cc 的全部格子,所以记录的是该颜色分量数的真实增加量。进入阶段结束后不再有新格子获得 cc;把删除序列倒放就成为纯加点序列,因此倒序加点增量取反后,恰好是正序结束时刻的真实变化量。颜色 00 同理,只是所有格子从时刻零开始存在。

    不同颜色的格子永不属于同一连通块,所以各颜色分量数可以直接相加。汇总所有颜色在每个时刻的变化并求前缀和,得到每次操作后的全矩阵连通块数。

    • 1

    信息

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