AT_abc407_f [ABC407F] Sums of Sliding Window Maximum 题解
题意
一个长度为
思路
如果不用分不同长度怎么做?
可以考虑每个数的贡献,用单调栈求出每个数的贡献区间,直接加和即可。
要分长度怎么做?
假设用单调栈求出当前讨论的
其实就是在
我们设
现在可以对要贡献的连续子序列的长度
- 对于
1\le k \le p 的情况,每种k 会有k 次被选,这时就是对答案数组的[1,p] 每个位置加i ,可以差分解决(具体地,先正常差分,然后在统计完做前缀和时,给位置i 乘上权重i )。 - 对于
p < k \le q 的情况,每种k 会有p 次被选,这时就是对答案数组的[p+1,q] 每个位置加p ,用典型的差分解决。 - 对于
q < k \le len 的情况,每种k 会有len-k+1 次被选,这时就是对答案数组的[q+1,len] 每个位置加len-i+1 ,此时就有些复杂了。分析发现,在区间内,所加的数是每次 -1 的,这时如果我们用差分去解决它,会在差分数组上呈现:加一个数,然后连续一串 -1,这一串 -1 就是在差分数组上区间修改,可以再用一次差分解决它。
基本就讨论完了,还有一个细节,上述对答案数组的修改时,没有带上权
代码
我觉得我写的有点乱,就只放链接了:Code。