[模拟赛]夏虫

image
首先不考虑位置交换,抓完虫子要 n-1 精力,所以我们只用求出询问区间内操作3的总次数。
设某个位置为 x。
设 Lx 表示 x 左边第一个 a[Lx]>=a[x] 的数,Rx 表示 x 右边第一个 a[Rx]>=a[x] 的数。
并设 dp[x] 表示 x 所需操作3的次数,则

\[\begin{cases} dp_x=dp_{Lx}+1,&a_{Lx}<a_{Rx} \\ dp_x=dp_{Rx}+1,&a_Rx<a_{Lx} \end{cases} \]

虽然这个转移需要考虑 x 左边的区间和右边的区间,但 dp 值是和两边都有关的,原因在于我们获得新的能力值后是可以往左往右随便跳的,那么 x 抓完 n 个虫子需要获得的值是一定的。
进一步推理,设 LU 为 \(\sum_{i=1}^{x-1}\) 的后缀最大值集合,RU 为 \(\sum_{i=x+1}^n\) 的前缀最大值,则 \(dp_x=|LU \bigcup RU|-1\)
加上交换,设 a[x]<a[x+1]。
不难发现,\(\sum_{i=Lx+1}^{x-1}dp_i\) 减少1,当且仅当 \(a_{Lx}>a_x\)
这样就可以处理 \(a_x\)\(a_{x+1}\) 对其他位置的贡献。
然后 x 和 x+1 直接按第一个 dp 式转移就行了。

posted @ 2023-08-29 22:31  StranGePants  阅读(10)  评论(2编辑  收藏  举报