1 条题解

  • 0
    @ 2025-12-3 15:53:48

    题意理解
    给定长度为 ( 2n+1 ) 的 01 串,需要在相邻数字之间插入 ( n ) 个 ? 和 ( n ) 个 :(以及括号),构成合法的三目运算符表达式,使其值为 1。
    三目运算符为右结合,构造时数字顺序必须与原串一致。

    关键观察

    1. 表达式值为 1 的必要条件:最后一个数字必须为 1(因为最终返回值要么是 ? 前的分支,要么是 : 后的分支,而最后一个数字是表达式的最右操作数)。
    2. 若最后一个数字为 0,则一定无解(除非通过括号改变求值顺序,但右结合性决定了最终操作数固定)。
    3. 构造策略:利用 a?b:c 的特性,当 a=1 时结果为 b,当 a=0 时结果为 c。通过递归/分段构造,确保最终返回 1。

    算法流程

    情况 1:最后一个数字为 0
    直接输出 "No"

    情况 2:最后一个数字为 1

    • 若整个串已经是 "1",直接输出 "1"
    • 否则,根据前几个字符的模式,递归构造:

    设函数 solve(s) 处理以 1 结尾的串:

    1. 模式 A(首字符为 '0'):
      构造形如 0?(...):1 的表达式,其中 (...) 部分递归处理去掉首尾的中间部分。
    2. 模式 B(首字符为 '1',次字符为 '0'):
      构造形如 (1?0:x)?(...):1,其中 x 是第三个字符,(...) 递归处理剩余部分。
    3. 模式 C(首字符为 '1',次字符为 '1'):
      构造形如 1?1:(...),其中 (...) 递归处理去掉前两个字符的剩余部分。

    情况 3:最后一个数字为 1,但需要特殊处理
    当串中有多个 '1' 时,可尝试选择中间的某个 '1' 作为分割点,构造形如 (前段)?(中段):(后段) 的表达式,使得整体为 1。
    具体策略:从右向左扫描,寻找满足以下条件的 '1' 的位置 i

    • i 到末尾的距离为奇数(保证可分割为合法表达式段)。
    • 将串分为 [0,i][i+1,pre][pre+2, end] 三段,分别递归构造,使得整体表达式为 1。

    构造细节

    • 递归构造时,每层添加括号保持结合顺序。
    • 每处理两个字符(一个数字和一个运算符),减少问题规模。
    • 保证最终表达式长度在 ( O(n) ) 内。

    无解判断

    1. 最后一个字符为 0 → 无解。
    2. 尝试所有可能的分割点后仍无法构造 → 无解。

    复杂度分析

    • 扫描与递归构造:每个字符至多处理一次,( O(n) )。
    • 表达式长度:每个数字对应常数个字符,总长度 ( O(n) )。

    算法标签

    • 递归构造
    • 三目运算符表达式解析
    • 分治与贪心
    • 字符串处理

    样例验证
    样例 1:"10101",最后一个字符为 1,按模式 C 构造,得到 (1?0:1)?0:1,值为 1。
    样例 2:"00000",最后一个字符为 0,无解。

    总结
    本质是利用三目运算符的短路特性,通过递归分治构造,确保最终返回 1。关键在于正确处理以 1 结尾的串,并利用串中的 1 作为控制点引导求值路径。

    • 1

    「THUPC 2025」一个 01 串,n 次三目运算符,最后值为 1

    信息

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