G Haitang and Rock Paper Scissors 题解
在竞赛讨论区看 Latex一切正常。
首先考虑朴素dp,
定义  为前 
 个对手中,在第 
 个对手出石头/步/剪刀能得到的最大分数为 
 的方案数。
那么我们最终的答案就是 。
对于状态方程,当前为 ,然后前一个石头/布/剪刀能得到的最大分数为 
。
对手出的石头,那么状态方程为 。
对手出的布,那么状态方程为 。
对手出的剪刀,那么状态方程为 。
当我们本轮出石头,那我们对前一轮的布和剪刀取 ,这样一定可以避免连续两轮出一样的手势。
这样的时间复杂度是  的。
我们考虑如何优化,这里我们可以通过转移方程看到,一定有一维是 ,那么我们可以用一个手势来代替这一维。
定义  为前 
 个对手中,在第 
 个对手出 
 能得到的最大分数为 
 的方案数。
那么答案还是同理 。
对于状态方程,当前为 ,然后前一个 
 能得到的最大分数为 
,
对手出的 ,那么我们需要考虑 
 和 
 的关系。
我们这一轮为  的手势是 
,所以我们第四维一定是 
。
所以我们  , 
 表示取
 和 
 得分的最大值,
 表示取 
 和 
 得分的最大值 
。
定义 。
对于第  轮,
 的最大得分为 
,
 的最大得分为 
。
当  时,
- 此时 
。
 表示取
和
得分的最大值,这里为
。
表示取
和
得分的最大值
,这里为
,因为
是
。
- 所以状态转移方程为 
。
 
当  时,
- 此时 
。
 表示取
和
得分的最大值,这里为
,因为
是
。
表示取
和
得分的最大值
,这里为
,因为
是
。
- 所以状态转移方程为 
。
 
当  时,
- 此时 
。
 表示取
和
得分的最大值,这里为
,因为
是
。
表示取
和
得分的最大值
,这里为
。
- 所以状态转移方程为 
。
 
到这里时间复杂度优化为 。
我们还需要优化时间复杂度。
这里我们可以想到我们无论如何都不可能失败,总可以做到要么赢,要么平局。
那么从这一点,我们的  是一定不会减少的。
所以一但  增加,我们之后的所有方案都不会减少了,而且一但增加,只会增加 
,
那么从这一步开始有多少方案,我们就贡献了  乘上方案个数。
对于某一段的方案数,假设这一段的  的数量为 
,那么这一段的方案数为 
。
所以我们需要维护一个  数量的前缀和。
定义  表示第 
 个到第 
 个之间有多少个 
。
既然只需要 ,我们可以直接维护 
,这样 
 也可以同时维护。
定义  为前 
 个对手中,在第 
 个对手出 
 能得到的最大分数减去 
 能得到的最大分数为 
 的方案数。
对手出的 ,我们还是要考虑 
 和 
 的关系。
我们这一轮为  的手势是 
,所以我们第三维一定是 
。
所以我们  , 
 表示取
 和 
 得分的最大值,
 表示取 
 和 
 得分的最大值 
。
定义 。
对于第  轮,
 的最大得分为 
,
 的最大得分为 
,
。
当  时,
- 
此时
。
 - 
表示取
和
得分的最大值,这里为
。
 - 
表示取
和
得分的最大值
,这里为
,因为
是
。
 - 
那么
,
 - 
这个式子我们可以轻易的看出当
即
,得到
。
 - 
否则得到
。
 - 
所以状态转移方程为
 - 
当
时,
,
 - 
否则,
。
 - 
然后
,
 - 
此时当
最大值才会变化,也就是说
,
 - 
这个式子等价于
。
 - 
所以当
的时候,我们对答案的贡献为
。
 
当  时,
- 
此时
。
 - 
表示取
和
得分的最大值,这里为
,因为
是
。
 - 
表示取
和
得分的最大值
,这里为
,因为
是
。
 - 
那么
,
 - 
所以状态转移方程为
 - 
 - 
然后
 - 
此时只有
最大值才会变化,也就是说
,
 - 
这个式子等价于
。
 - 
所以当
的时候,我们对答案的贡献为
。
 
当  时,
- 此时 
。
 表示取
和
得分的最大值,这里为
,因为
是
。
表示取
和
得分的最大值
,这里为
。
- 那么 
,
 - 此时当 
即
,得到
,
 - 否则得到 
。
 - 所以状态转移方程为
 - 当 
,
,
 - 否则,
。
 - 然后 
,
 - 此时无论何时都会发现 
都会变大,
 - 这个时候直接对答案贡献为 
。
 
最终时间复杂度为 。

京公网安备 11010502036488号