G Haitang and Rock Paper Scissors 题解

在竞赛讨论区看 Latex一切正常。

首先考虑朴素dp,

定义 为前 个对手中,在第 个对手出石头/步/剪刀能得到的最大分数为 的方案数。

那么我们最终的答案就是

对于状态方程,当前为 ,然后前一个石头/布/剪刀能得到的最大分数为

对手出的石头,那么状态方程为

对手出的布,那么状态方程为

对手出的剪刀,那么状态方程为

当我们本轮出石头,那我们对前一轮的布和剪刀取 ,这样一定可以避免连续两轮出一样的手势。

这样的时间复杂度是 的。

我们考虑如何优化,这里我们可以通过转移方程看到,一定有一维是 ,那么我们可以用一个手势来代替这一维。

定义 为前 个对手中,在第 个对手出 能得到的最大分数为 的方案数。

那么答案还是同理

对于状态方程,当前为 ,然后前一个 能得到的最大分数为

对手出的 ,那么我们需要考虑 的关系。

我们这一轮为 的手势是 ,所以我们第四维一定是

所以我们 表示取 得分的最大值, 表示取 得分的最大值

定义

对于第 轮, 的最大得分为 的最大得分为

时,

  • 此时
  • 表示取 得分的最大值,这里为
  • 表示取 得分的最大值 ,这里为 ,因为
  • 所以状态转移方程为

时,

  • 此时
  • 表示取 得分的最大值,这里为 ,因为
  • 表示取 得分的最大值 ,这里为 ,因为
  • 所以状态转移方程为

时,

  • 此时
  • 表示取 得分的最大值,这里为 ,因为
  • 表示取 得分的最大值 ,这里为
  • 所以状态转移方程为

到这里时间复杂度优化为

我们还需要优化时间复杂度。

这里我们可以想到我们无论如何都不可能失败,总可以做到要么赢,要么平局。

那么从这一点,我们的 是一定不会减少的。

所以一但 增加,我们之后的所有方案都不会减少了,而且一但增加,只会增加

那么从这一步开始有多少方案,我们就贡献了 乘上方案个数。

对于某一段的方案数,假设这一段的 的数量为 ,那么这一段的方案数为

所以我们需要维护一个 数量的前缀和。

定义 表示第 个到第 个之间有多少个

既然只需要 ,我们可以直接维护 ,这样 也可以同时维护。

定义 为前 个对手中,在第 个对手出 能得到的最大分数减去 能得到的最大分数为 的方案数。

对手出的 ,我们还是要考虑 的关系。

我们这一轮为 的手势是 ,所以我们第三维一定是

所以我们 表示取 得分的最大值, 表示取 得分的最大值

定义

对于第 轮, 的最大得分为 的最大得分为

时,

  • 此时

  • 表示取 得分的最大值,这里为

  • 表示取 得分的最大值 ,这里为 ,因为

  • 那么

  • 这个式子我们可以轻易的看出当 ,得到

  • 否则得到

  • 所以状态转移方程为

  • 时,

  • 否则,

  • 然后

  • 此时当 最大值才会变化,也就是说

  • 这个式子等价于

  • 所以当 的时候,我们对答案的贡献为

时,

  • 此时

  • 表示取 得分的最大值,这里为 ,因为

  • 表示取 得分的最大值 ,这里为 ,因为

  • 那么

  • 所以状态转移方程为

  • 然后

  • 此时只有 最大值才会变化,也就是说

  • 这个式子等价于

  • 所以当 的时候,我们对答案的贡献为

时,

  • 此时
  • 表示取 得分的最大值,这里为 ,因为
  • 表示取 得分的最大值 ,这里为
  • 那么
  • 此时当 ,得到
  • 否则得到
  • 所以状态转移方程为
  • 否则,
  • 然后
  • 此时无论何时都会发现 都会变大,
  • 这个时候直接对答案贡献为

最终时间复杂度为