tiansuohaoer 在 Leetcode每日一题 —— 3420. 统计 K 次操作以内得到非递减子数组的数目 中发帖

思路
考虑从右往左维护一个单调队列,在队列中依次记录元素 [l,r],代表当前的 nums_i 能够覆盖区间 [l,r],加入新元素 nums_i 时根据 nums_i 和 nums_l 的大小关系弹出更小区间的头部元素,然后加入 nums_i 覆盖的新区间 [i,r'] 及这个区间对应的总代价。
完成加入后处理当前位置 i 能满足的最远右端点 j 的位置。我们发现在 i 从右往左移动的过程中固定的右端点 j 花费的代价一定会不断变大,因此 j 也会随着 i 单调左移。
具体地,我们不断减去当前的 j 对应的覆盖代价 nums_l-nums_j 并将 j 左移一位,如果区间被删除就弹出尾部元素,直到总代价不超过 k。此时的 j-i+1 即为 i 对应贡献,将贡献求和即可。时间复杂度 O(n)。

代码
class Solution {
public:
long long co...