1 条题解

  • 0
    @ 2025-10-26 23:03:18

    题目分析

    本题要求为 m×nm \times n 的表格(每列是 0m10 \dots m-1 的排列)的每一列设置一个阈值 zj[0,m]z_j \in [0,m],使得对于每一行 ii,根据给定的 NMLP(非重复单调线性规划)计算出的布尔函数值 fif_i 满足恰好有 ss 行的结果为 11,其余为 00


    核心思路

    1. 单调性
      由于 NMLP 只包含 AND 和 OR 运算,没有 NOT,因此 fif_i 关于 z1,,znz_1, \dots, z_n 是单调非减的(增加 zjz_j 只会让某些 val[j]val[j] 从 0 变 1,不会让 1 变 0)。

    2. 列排列性质
      jj 列的 x1,j,,xm,jx_{1,j}, \dots, x_{m,j}0m10 \dots m-1 的排列,因此当 zj=tz_j = t 时,该列恰好有 tt 行的 val[j]=1val[j] = 1

    3. 解法策略
      zj=0z_j = 0(所有输入为 0)开始,逐步增加某些 zjz_j,使得输出为 1 的行数逐渐增加,直到达到 ss
      因为单调性,我们可以按列依次激活(增加 zjz_j),并利用 NMLP 的结构快速判断哪些行的输出会从 0 变 1。


    算法标签

    • 单调性分析
    • 贪心构造
    • 树形结构处理
    • 位运算模拟

    代码解析

    数据结构

    • a[i][j] 表示第 ii 行第 jj 列的值。
    • pos[j][v] 表示在第 jj 列中值为 vv 的行号。
    • fa[u] 表示节点 uu 的父节点。
    • son[0/1][u] 表示节点 uu 的两个子节点。
    • tp[u] 表示节点 uu 的操作类型(1 为 AND,2 为 OR)。

    主要流程

    1. 读入 NMLP 结构
      对于每行 ii,从 m+1m+12m12m-1 的节点表示逻辑门,建立父子关系。

    2. 读入表格数据
      并构建 pos 数组,便于按列按值查找行号。

    3. 特殊情况处理
      如果 s=0s = 0,则所有 zj=0z_j = 0 即可。

    4. 贪心构造阈值
      对每列 jj,按值 0m10 \dots m-1 升序遍历:

      • 将当前值对应的行的该列输入 val[j]val[j] 设为 1(通过 modify 函数向上传播)。
      • 检查当前输出为 1 的行数 cnt 是否等于 ss
      • 如果等于,则当前列 zj=当前值+1z_j = \text{当前值} + 1,后续列 zk=0z_k = 0,前面列 zk=mz_k = m(保证单调性且不减少已激活的行数)。

    modify 函数

    • 从当前叶子节点向上更新,直到根节点或遇到未确定节点。
    • 利用单调性:
      • AND 门:两个输入都为 1 时输出才为 1。
      • OR 门:任一输入为 1 时输出为 1。
        当某个门的输出确定变为 1 时,继续向上传播。

    复杂度分析

    • 每列最多遍历 mm 个值,每次 modifyO(树高)O(\text{树高}),树高 O(m)O(m)
    • 总复杂度 O(m2n)O(m^2 n) 在 worst-case 较大,但实际数据约束 nm3×105n \cdot m \le 3\times 10^5,且通过单调性剪枝,可接受。

    样例验证

    对于样例:

    n=4, m=3, s=2
    

    代码按列遍历,当 j=1j=1 时值从 0 到 2 尝试,发现 j=2j=2 时在 z2=1z_2=1cnt=2,于是输出:

    0 1 2 3
    

    符合题意。


    总结

    本题利用单调性和列排列性质,通过贪心逐列激活输入,并借助 NMLP 的树形结构快速更新输出,构造满足条件的阈值方案。

    • 1

    信息

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