双指针移动过程中,修改操作直接进行(在操作栈顶压入操作)。对于删除操作,则暴力弹栈(撤销)并将弹出的操作暂存到一个数组 b 中,直到栈顶为想要删除的操作。此时弹栈,然后再弹出栈顶 ∣b∣ 个元素(不足 ∣b∣ 个则弹空),并将这些元素也加入 b。最后将 b 中元素按照编号排序,再从大到小依次压入栈中。
复杂度证明
考虑每个时刻栈底到栈顶都形如若干段下降段。
由于每次删除的是最小值,故执行删除操作时,一个下降段要么被完全跳过,要么被删掉靠近栈顶的第一个元素。而一个下降段若被完全跳过,则其会在排序中和其它下降段融合,故其长度至少翻倍,故这部分的时间复杂度是 O(nlogn) 的;而删除靠近栈顶的第一个元素这个操作只会进行总共 n 次,故这部分的时间复杂度是 O(n) 的。