1 条题解
-
0
F. 重构 – 详细题解
问题转化
设 为前缀和,特别地 , 为所有元素的和。
对于第 个位置:- 若 ,则 。
- 若 ,则 ,即 。
因此,每个约束都将某个 表示为 的形式,其中 , 是整数常量。
初始已知 ,即 ;最终 ,即 。所有 必须满足 ,即 。
对于任意 ,由三角不等式可得 .确定性与不定性
对于已经确定的
P或S,它们强制某个 的具体表达式(即 )。
对于?,我们可以选择将其解释为P或S,从而在对应的位置添加强制点。
我们要统计所有选择,使得整个系统的约束(等式和不等式)有解。关键思想
因为所有 最终都是 的线性函数,且 等价于任意两位置之间的 (1) 式成立,所以整个系统可解当且仅当:
- 所有强制点(包括 和 )的表达式之间不冲突(同一位置不能有两个不同的 )。
- 对强制点按位置排序后,相邻两点之间的 (1) 式对 给出的线性不等式有公共解(即所有区间的交集非空)。
因此,我们只需要维护当前已经出现的强制点序列以及 的可行区间。每添加一个新强制点,就与上一个强制点通过 (1) 式更新区间,若更新后区间非空则状态合法。
动态规划设计
按位置从左到右处理 ,维护最后一个强制点的信息:
- 其位置 ,
- 系数 ,
- 常数 ,
- 当前 的可行区间 (闭区间,整数)。
初始状态:,方案数为 。
转移时根据 :
-
如果 :只能选择 P,因此新强制点为 。设上一个强制点为 ,计算差 ,,步长 。
代入 (1) 得到关于 的不等式
$|\,\Delta c \cdot S + \Delta d\,| \le m \cdot \Delta i$.
若 ,则要求 ,否则区间不变;
若 ,则 ,即 $S \in [-m\Delta i - \Delta d,\; m\Delta i - \Delta d]$;
若 ,则 $S \in [\Delta d - m\Delta i,\; \Delta d + m\Delta i]$。
将求出的区间与当前 取交集,若新区间非空,则新状态 继承方案数。 -
如果 :只能选择 S,新强制点为 。注意必须保证 ,否则强制点顺序错乱(后出现的强制点位置必须更大)。然后同样计算 ,,,更新区间并产生新状态。
-
如果 :两种选择均可,分别按照上述规则生成两个新状态,方案数累加。
由于 且总 之和 ,状态总数可控。实际实现中,每个状态用 唯一标识,使用
map存储方案数。每次转移时,遍历当前所有状态,对每个状态产生 或 个后继,并将相同后继的状态合并(方案数相加)。最终处理
处理完所有 后,我们还需要强制加入终点强制点 ,因为 必须成立。
对于每个剩余状态,用它作为上一个强制点,与终点通过 (1) 式更新区间。如果最终区间非空,则该状态的方案数累加到答案中。复杂度
状态数最多为 (每个位置至多两种表达式,区间端点由 和 的线性组合决定,数目有限)。总转移次数 ,在 时可以接受。实际求和 ,运行时间远小于 秒。
答案
输出所有可行方案的总数,对 取模。
注意事项
- 区间端点可能非常大( 可达 ,约 ),使用
long long或__int128存储。 - 初始区间取 足够覆盖所有可能。
- 当
?位置选择S时,新强制点位置为 ,必须保证它大于上一个强制点位置,否则跳过该选择。 - 无需显式存储所有强制点,只需记录最后一个,因为不等式已经保证了前面所有点之间的约束传递性。
- 1
信息
- ID
- 6946
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者