Loading

Roma and Poker

算法

因为这题是从差分约束专题来的, 所以肯定要朝着化为不等式的方向化简

\(TimeW_i, TimeD_i, TimeL_i\) 表示原串前 \(i\) 位中 \(W, D, L\) 的个数
\(W_i, D_i, L_i\) 表示最后结果中前 \(i\)\(W, D, L\) 的个数
根据原串有

\[\left\{ \begin{array}{lr} W_i \geq TimeW_i, & \\ D_i \geq TimeD_i, & \\ L_i \geq TimeL_i, & \\ W_i + D_i + L_i = i \end{array} \right. \]

根据题目约束条件有

\[\left\{ \begin{array}{lr} \mid W_n - L_n \mid = k, & \\ \mid W_i - L_i \mid < k \left[i \in [1, n) \right] \end{array} \right. \]

仅仅化成这样是不可做的
直觉上感觉可以挨个枚举, 这是符合人类本能的(
考虑 $ W_i + D_i + L_i = i $ , 从 \(n\)\(1\) 枚举 \(i\) , 每一次 \(W_i + D_i + L_i\) 的变化量能且仅能为 \(1\)
假设每一次选择减少的序列为 \(S\)
则有:
对于约束条件
\(u = \max(W_n, L_n), v = \min(W_n, L_n)\) 对应的字符
\(S\)\(v\) 可在一定区间内滑动, 以保证 \(\mid W_i - L_i \mid < k\)
\(dis1_i\) 表示 \(u\)\(i\) 处的变化量, \(dis2_i\) 表示 \(v\)\(i\) 处的变化量的相反数, 有 \(dis1_i, -dis2_i \in \{ 0, 1 \}\), \(dis1_i - dis2_i \in \{ 0, 1 \}\)

枚举 \(W_n\) , 得到 \(L_n, D_n\)
关于原串中的约束和题目中的约束, 用 \(\sum^{i = 1}_{j} dis1_i, \sum^{i = 1}_{j} dis2_i, L_n, D_n, W_n\) 显然可以表示, 不加赘述

\(dis\) 表示 \(dis1, dis2\) 的倒序前缀和
则有
pA6HILn.png

代码

总结

这种三种 / 两种填充方式的图 (本题中的 \(D\) 并没有什么卵用), 考虑记为 \(1, 0, -1\) 处理
呜呜呜, 他为什么这么聪明

posted @ 2024-11-10 20:13  Yorg  阅读(10)  评论(0)    收藏  举报