某张牌在牌河中的状态变化,只会影响与其距离为 3 的特定位置的“安全状态”。
采用 状态驱动的贡献计数。我们维护一个全局变量 ans 表示当前安全牌的总种数,以及一个频率数组 cnt[] 记录牌河中每种数字的出现次数。
考虑牌 进入或离开牌河时,它仅对以下两个位置的安全性产生直接影响:
- 位置
:因为
,当
在牌河时,
可能变安全。
- 位置
:因为
,当
在牌河时,
可能变安全。
判定准则:
一张牌 是“安全”的,当且仅当:
状态转移
只有当某种牌的计数从 0 变为 1 或者从 1 变为 0 时,安全状态才会发生本质改变。
- 增加
(op=1):
- 如果
cnt[num]增加前为0(表示该牌首次进入牌河):- 检查
。如果
,且此时
本身不满足安全条件(即
也是
0),则从不安全变为安全,
ans++。 - 检查
。如果
,且此时
本身不满足安全条件(即
也是
0),则从不安全变为安全,
ans++。
- 检查
cnt[num]++。
- 如果
- 移除
(op=2):
cnt[num]--。- 如果
cnt[num]减少后变为0(表示该牌彻底消失):- 检查
。如果
,且移除后
不再满足任何安全条件(即
也是
0),则从安全变为不安全,
ans--。 - 检查
。如果
,且移除后
不再满足任何安全条件(即
也是
0),则从安全变为不安全,
ans--。
- 检查

京公网安备 11010502036488号