AT_abc407_f [ABC407F] Sums of Sliding Window Maximum 题解

· · 题解

题意

一个长度为 n 的序列 a_i,求其不同长度连续子序列的最大值和。

思路

如果不用分不同长度怎么做?

可以考虑每个数的贡献,用单调栈求出每个数的贡献区间,直接加和即可。

要分长度怎么做?

假设用单调栈求出当前讨论的 a_i 的贡献区间是 [l_i,r_i],即在这个区间内、包括了 a_i 的连续子序列都会被 a_i 贡献,我们只要求出每种长度的连续子序列被选了几次,与 a_i 的乘积就是一次对答案的贡献。

其实就是在 [l_i,i][i,r_i] 中分别选一个数 xy[x,y] 就会被 a_i 贡献。

我们设 L[l_i,i] 的长度,R[i,r_i] 的长度,len[l_i,r_i] 的长度,p=\min(L,R)q=\max(L,R)

现在可以对要贡献的连续子序列的长度 k 分类讨论了。

基本就讨论完了,还有一个细节,上述对答案数组的修改时,没有带上权 a_i(答案要求的是最大值和而不是个数啊喂),写代码时注意一下。

代码

我觉得我写的有点乱,就只放链接了:Code。