1 条题解

  • 0
    @ 2026-5-5 20:18:12

    F. 重构 – 详细题解

    问题转化

    xi=a1+a2++aix_i = a_1 + a_2 + \dots + a_i 为前缀和,特别地 x0=0x_0 = 0xn=Sx_n = S 为所有元素的和。
    对于第 ii 个位置:

    • si=Ps_i = \text{P},则 bi=xib_i = x_i
    • si=Ss_i = \text{S},则 bi=ai++an=Sxi1b_i = a_i + \dots + a_n = S - x_{i-1},即 xi1=Sbix_{i-1} = S - b_i

    因此,每个约束都将某个 xjx_j 表示为 cjS+djc_j S + d_j 的形式,其中 cj{0,1}c_j \in \{0,1\}djd_j 是整数常量。
    初始已知 x0=0x_0 = 0,即 (c0,d0)=(0,0)(c_0,d_0)=(0,0);最终 xn=Sx_n = S,即 (cn,dn)=(1,0)(c_n,d_n)=(1,0)

    所有 ai=xixi1a_i = x_i - x_{i-1} 必须满足 aim|a_i| \le m,即 xixi1m|x_i - x_{i-1}| \le m
    对于任意 l<rl < r,由三角不等式可得 xrxlm(rl)|x_r - x_l| \le m \cdot (r-l). (1)\qquad (1)

    确定性与不定性

    对于已经确定的 PS,它们强制某个 xjx_j 的具体表达式(即 (cj,dj)(c_j,d_j))。
    对于 ?,我们可以选择将其解释为 PS,从而在对应的位置添加强制点。
    我们要统计所有选择,使得整个系统的约束(等式和不等式)有解。

    关键思想

    因为所有 xjx_j 最终都是 SS 的线性函数,且 xixi1m|x_i - x_{i-1}| \le m 等价于任意两位置之间的 (1) 式成立,所以整个系统可解当且仅当:

    1. 所有强制点(包括 x0x_0xnx_n)的表达式之间不冲突(同一位置不能有两个不同的 (c,d)(c,d))。
    2. 对强制点按位置排序后,相邻两点之间的 (1) 式对 SS 给出的线性不等式有公共解(即所有区间的交集非空)。

    因此,我们只需要维护当前已经出现的强制点序列以及 SS 的可行区间。每添加一个新强制点,就与上一个强制点通过 (1) 式更新区间,若更新后区间非空则状态合法。

    动态规划设计

    按位置从左到右处理 i=1ni=1 \dots n,维护最后一个强制点的信息:

    • 其位置 pp
    • 系数 c{0,1}c \in \{0,1\}
    • 常数 dd
    • 当前 SS 的可行区间 [L,R][L,R](闭区间,整数)。

    初始状态:(p=0,  c=0,  d=0,  L=,  R=+)(p=0,\; c=0,\; d=0,\; L=-\infty,\; R=+\infty),方案数为 11

    转移时根据 sis_i

    • 如果 si=Ps_i = \text{P}:只能选择 P,因此新强制点为 (i,  0,  bi)(i,\;0,\;b_i)。设上一个强制点为 (p,c,d)(p,c,d),计算差 Δc=0c\Delta c = 0 - cΔd=bid\Delta d = b_i - d,步长 Δi=ip\Delta i = i - p
      代入 (1) 得到关于 SS 的不等式
      $|\,\Delta c \cdot S + \Delta d\,| \le m \cdot \Delta i$.
      Δc=0\Delta c = 0,则要求 ΔdmΔi|\Delta d| \le m\Delta i,否则区间不变;
      Δc=1\Delta c = 1,则 mΔiS+ΔdmΔi-m\Delta i \le S + \Delta d \le m\Delta i,即 $S \in [-m\Delta i - \Delta d,\; m\Delta i - \Delta d]$;
      Δc=1\Delta c = -1,则 $S \in [\Delta d - m\Delta i,\; \Delta d + m\Delta i]$。
      将求出的区间与当前 [L,R][L,R] 取交集,若新区间非空,则新状态 (i,0,bi,L,R)(i,0,b_i, L',R') 继承方案数。

    • 如果 si=Ss_i = \text{S}:只能选择 S,新强制点为 (i1,  1,  bi)(i-1,\;1,\;-b_i)。注意必须保证 i1>pi-1 > p,否则强制点顺序错乱(后出现的强制点位置必须更大)。然后同样计算 Δc=1c\Delta c = 1-cΔd=bid\Delta d = -b_i - dΔi=(i1)p\Delta i = (i-1)-p,更新区间并产生新状态。

    • 如果 si=?s_i = \text{?}:两种选择均可,分别按照上述规则生成两个新状态,方案数累加。

    由于 n2000n \le 2000 且总 nn 之和 5000\le 5000,状态总数可控。实际实现中,每个状态用 (p,c,d,L,R)(p,c,d,L,R) 唯一标识,使用 map 存储方案数。每次转移时,遍历当前所有状态,对每个状态产生 1122 个后继,并将相同后继的状态合并(方案数相加)。

    最终处理

    处理完所有 ii 后,我们还需要强制加入终点强制点 (n,  1,  0)(n,\;1,\;0),因为 xn=Sx_n=S 必须成立。
    对于每个剩余状态,用它作为上一个强制点,与终点通过 (1) 式更新区间。如果最终区间非空,则该状态的方案数累加到答案中。

    复杂度

    状态数最多为 O(n2)O(n^2)(每个位置至多两种表达式,区间端点由 bbmm 的线性组合决定,数目有限)。总转移次数 O(状态数)O(\text{状态数}),在 n2000n\le 2000 时可以接受。实际求和 n5000\sum n \le 5000,运行时间远小于 22 秒。

    答案

    输出所有可行方案的总数,对 998244353998244353 取模。

    注意事项

    • 区间端点可能非常大(S|S| 可达 mnm\cdot n,约 2×10122\times 10^{12}),使用 long long__int128 存储。
    • 初始区间取 [1018,1018][-10^{18}, 10^{18}] 足够覆盖所有可能。
    • ? 位置选择 S 时,新强制点位置为 i1i-1,必须保证它大于上一个强制点位置,否则跳过该选择。
    • 无需显式存储所有强制点,只需记录最后一个,因为不等式已经保证了前面所有点之间的约束传递性。
    • 1

    信息

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