我有练功症。
WKHALJHLAIWHFLKAWF
问题描述
对于序列 和每个 ,计算一个最大的 使得 ,记作 。
其中 代表 内某种信息合并,并且不存在 ,,即满足单调性。
标准版:
支持加入一个元素,删除一个元素,以及快速合并。
例如区间和,哈希值等信息。
例如
双指针,初始 每次将 并计算新的 ,然后不断让 直到 为止,此时 。
这里 维护了一个队列。
都只会增加,因此复杂度 。
加强版:
支持加入一个元素,撤销一次上一次加入,不支持删除,依然可以快速合并。
例如区间 等信息。
不考虑拿线段树等结构硬维护 ,不优美。
还是考虑双指针,但是 不能像前面那样显示地维护队列,考虑使用双栈模拟队列,在 中找一个分界点,设其为 ,那么 和 就是两个栈,合并这两个栈的信息就可以得到 。
当 时,显然可以直接加入。
当 时,可以视作 内这个栈撤销了一个元素。直接弹出。
弹空后,再 会爆。考虑直接暴力重构。令 ,然后到序枚举 加到 新的 栈中。新的 为空栈。
还是只会增加,重构时每个元素只会被扫到一次,因此复杂度还是 。
二次加强版
支持加入一个元素,撤销一次上一次加入,不支持删除,不能快速合并。
朴素双指针我们甚至没有办法找到一个快速维护 的方法。
换个角度思考,对于某个位置 ,如果有 ,我们称 包含了 ,显然所有包含 的位置是一段以 为左端点的区间,我们记 为最大的 包含 。
如果我们知道了 的值我们可以使用线段树分治的方法维护出信息,很遗憾我们并不知道它的信息。
一个观察时 显然也是单调不降的,考虑对 双指针。
维护一个 ,表示 ,表示枚举 ,找出所有没有被访问过的 使得 ,然后就可以令 $ $。
本文作者:World Creater
本文链接:http://worldcreaterwc.github.io/two-pointers/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。