考虑二分 $w$ 计算 $\leq w$ 需要的最小限制次数,设为 $A(w)$ 。注意到 $A(w)$ 是 $O(n)$ 段的函数。将 $a$ 做前缀和,操作变为后缀减。相当于每次维护 $L(w)\rightarrow \min(L(w),a_i+w)$,然后若 $a_i>L(w)$ 就要操作 $a_i-L(w)$ 次。将后缀减变成前缀加,遇见 $a_i>L(w)$ 时,只需要令 $L(w):=a_i$ 即可。
算好 $A(w)$ 的转移,再统一转移 $L(w)\rightarrow \min(L(w),a_i+w)$ 。注意到 $L(w)$ 也是分段函数,只需要拿栈维护每一段即可。模拟的时候将 $A(w)$ 的修改处理出来,最后排序统一处理即可。