baka's trick
posted on 2025-11-10 08:12:31 | under | source
简介:解决不支持删除的双指针问题,要求是便于处理信息合并。记信息合并复杂度 \(O(M)\),则时空复杂度 \(O(nM)\)。
除 \(l,r\) 外,再记 \(mid\),时刻维护 \(i\in [l,mid]\) 区间 \([i,mid]\) 的信息、\(i\in (mid,r]\) 区间 \((mid,i]\) 的信息(可视为两个栈,因此又称双栈模拟)。查询时直接合并。
右端点右移易做,左端点右移也是直接删除元素即可,吗?当 \(l>mid\) 时,直接令 \(mid=r\) 并开始暴力重构(从 \([mid,mid]\) 开始向左添加元素)。发现每个元素至多被 \(r\) 右移加入一次、被暴力重构再加入一次,总次数 \(O(n)\)。
记 \(K\) 为新增元素复杂度,\(q\) 是查询次数,则时间复杂度严格来说是 \(O(nK+qM)\)。但一般来说 \(q,n\) 同阶,且合并严格强于新增,故记为 \(O(nM)\)。
细节:初值设为 \(l=1,r=mid=0\),注意看清楚元素加在首还是尾。

浙公网安备 33010602011771号