1 条题解

  • 0
    @ 2025-11-4 11:50:36

    「OOI 2016 Day 1」表格压缩 题解

    问题分析

    我们需要将原表格中的数值重新映射到新的正整数,使得:

    • 同一行内相对大小关系保持不变
    • 同一列内相对大小关系保持不变
    • 映射后的最大值尽可能小

    关键观察:

    • 如果两个单元格 ai,ja_{i,j}ak,la_{k,l} 不在同一行或同一列,它们可以映射到相同的值
    • 如果 ai,j<ai,ka_{i,j} < a_{i,k},则 bi,j<bi,kb_{i,j} < b_{i,k}
    • 如果 ai,j=ai,ka_{i,j} = a_{i,k},则 bi,j=bi,kb_{i,j} = b_{i,k}

    算法思路

    核心思想:图论建模

    将每个单元格 (i,j)(i,j) 看作图中的一个节点,建立偏序关系:

    1. 行约束:对于任意 i[1,n]i \in [1,n], j,k[1,m]j,k \in [1,m]

      • 如果 ai,j<ai,ka_{i,j} < a_{i,k},建立有向边 (i,j)(i,k)(i,j) \rightarrow (i,k)
      • 如果 ai,j=ai,ka_{i,j} = a_{i,k},合并节点 (i,j)(i,j)(i,k)(i,k)
    2. 列约束:对于任意 j[1,m]j \in [1,m], i,k[1,n]i,k \in [1,n]

      • 如果 ai,j<ak,ja_{i,j} < a_{k,j},建立有向边 (i,j)(k,j)(i,j) \rightarrow (k,j)
      • 如果 ai,j=ak,ja_{i,j} = a_{k,j},合并节点 (i,j)(i,j)(k,j)(k,j)
    3. 等价类合并:使用并查集处理相等关系,将必须相等的单元格合并为同一个节点

    4. 拓扑排序赋值:在得到的 DAG 上进行拓扑排序,每个节点的值 dp[u]=max(1,max{dp[v]+1vu})dp[u] = \max(1, \max\{dp[v] + 1 \mid v \to u\})

    具体步骤

    1. 预处理

    • n×mn \times m 表格展平为一维数组,索引函数:id(i,j)=i×m+jid(i,j) = i \times m + j
    • 初始化并查集,每个单元格独立为一个集合

    2. 等价类合并

    • 按行处理:对每行 ii,将值 ai,ja_{i,j} 相同的所有单元格 (i,j)(i,j) 合并到同一等价类
    • 按列处理:对每列 jj,将值 ai,ja_{i,j} 相同的所有单元格 (i,j)(i,j) 合并到同一等价类
    • 最终得到等价类集合 C={C1,C2,,Ck}\mathcal{C} = \{C_1, C_2, \ldots, C_k\}

    3. 建立约束图

    • 行约束边:对每行排序,在相邻的不同值对应的等价类间建立有向边 CpCqC_p \to C_q
    • 列约束边:对每列排序,在相邻的不同值对应的等价类间建立有向边 CpCqC_p \to C_q
    • 计算每个等价类的入度 deg[C]deg[C]

    4. 拓扑排序与动态规划

    • 初始化队列 QQ 包含所有入度为 00 的等价类,设 dp[C]=1dp[C] = 1
    • QQ 非空时:
      • 取出队首 CC,遍历所有出边 CCC \to C'
      • 更新 dp[C]=max(dp[C],dp[C]+1)dp[C'] = \max(dp[C'], dp[C] + 1)
      • deg[C]deg[C']11,若为 00 则入队

    5. 输出结果

    对于每个单元格 (i,j)(i,j),输出其所属等价类 CCdp[C]dp[C]

    复杂度分析

    时间复杂度

    • 排序O(nmlog(max(n,m)))O(nm \log(\max(n,m)))
    • 并查集O(nmα(nm))O(nm \alpha(nm))
    • 建图与拓扑排序O(nm)O(nm)
    • 总复杂度O(nmlog(nm))O(nm \log(nm))

    空间复杂度

    • 存储图结构O(nm)O(nm)
    • 并查集与DP数组O(nm)O(nm)
    • 总空间O(nm)O(nm)
    • 1

    信息

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