P10430 [JOISC 2024 Day1] 鱼 3
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。