1 条题解
-
0
题目分析
本题要求为 的表格(每列是 的排列)的每一列设置一个阈值 ,使得对于每一行 ,根据给定的 NMLP(非重复单调线性规划)计算出的布尔函数值 满足恰好有 行的结果为 ,其余为 。
核心思路
-
单调性
由于 NMLP 只包含 AND 和 OR 运算,没有 NOT,因此 关于 是单调非减的(增加 只会让某些 从 0 变 1,不会让 1 变 0)。 -
列排列性质
第 列的 是 的排列,因此当 时,该列恰好有 行的 。 -
解法策略
从 (所有输入为 0)开始,逐步增加某些 ,使得输出为 1 的行数逐渐增加,直到达到 。
因为单调性,我们可以按列依次激活(增加 ),并利用 NMLP 的结构快速判断哪些行的输出会从 0 变 1。
算法标签
- 单调性分析
- 贪心构造
- 树形结构处理
- 位运算模拟
代码解析
数据结构
a[i][j]表示第 行第 列的值。pos[j][v]表示在第 列中值为 的行号。fa[u]表示节点 的父节点。son[0/1][u]表示节点 的两个子节点。tp[u]表示节点 的操作类型(1 为 AND,2 为 OR)。
主要流程
-
读入 NMLP 结构
对于每行 ,从 到 的节点表示逻辑门,建立父子关系。 -
读入表格数据
并构建pos数组,便于按列按值查找行号。 -
特殊情况处理
如果 ,则所有 即可。 -
贪心构造阈值
对每列 ,按值 升序遍历:- 将当前值对应的行的该列输入 设为 1(通过
modify函数向上传播)。 - 检查当前输出为 1 的行数
cnt是否等于 。 - 如果等于,则当前列 ,后续列 ,前面列 (保证单调性且不减少已激活的行数)。
- 将当前值对应的行的该列输入 设为 1(通过
modify函数- 从当前叶子节点向上更新,直到根节点或遇到未确定节点。
- 利用单调性:
- AND 门:两个输入都为 1 时输出才为 1。
- OR 门:任一输入为 1 时输出为 1。
当某个门的输出确定变为 1 时,继续向上传播。
复杂度分析
- 每列最多遍历 个值,每次
modify是 ,树高 。 - 总复杂度 在 worst-case 较大,但实际数据约束 ,且通过单调性剪枝,可接受。
样例验证
对于样例:
n=4, m=3, s=2代码按列遍历,当 时值从 0 到 2 尝试,发现 时在 时
cnt=2,于是输出:0 1 2 3符合题意。
总结
本题利用单调性和列排列性质,通过贪心逐列激活输入,并借助 NMLP 的树形结构快速更新输出,构造满足条件的阈值方案。
-
- 1
信息
- ID
- 4210
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 1
- 上传者