My Blogs
P10430 [JOISC 2024 Day1] 鱼 3
首先操作可以看成是单点减 $k$ 和后缀减 $1$,问区间能不能全部减到 $0$,并最小化单点操作次数。
假设先进行所有的单点修改,则一定是把一个区间改成单增的。
考虑扫描线,从左向右依次新加入数,并且在这个过程中要保持当前的序列单增。可以用一个单调栈来维护连续段。
这里的连续段指的是相邻两个数的差小于 $k$ 的极大连续段,如果当前栈顶连续段的右端点大于新加入的数 $x$,就需要对整个连续段的数进行一次操作,直到满足右端点小于等于当前的 $x$。
栈顶不断减 $k$ 的过程中,可能会和它下面的一个连续段合并。这样复杂度是均摊 $\mathcal O(n)$ 的。假设这次对某个连续段进行了 $k$ 次操作,可以看成是一次序列上的区间加 $k$,查询就是查询区间和,用树状数组或者线段树实现,复杂度是 $\mathcal O(n\log n)$。代码找不到了 QwQ。